在javascript对象中,执行;“静态”;函数和原型函数共享同一名称空间?
不管这样一个命名方案是否明智,以下内容是否有效 var F = function() { this.f1 = function() {} } F.f1 = function() {} // "static" call var v1 = F.f1(); // prototype call var f = new F(); var v2 = f.f1(); var F=函数(){ this.f1=函数(){} } F.f1=函数(){} //“静态”呼叫 var v1=F.f1(); //原型调用 var f=新的f(); var v2=f.f1(); 它似乎应该是正常的,因为,例如,对象函数中的在javascript对象中,执行;“静态”;函数和原型函数共享同一名称空间?,javascript,object,scope,Javascript,Object,Scope,不管这样一个命名方案是否明智,以下内容是否有效 var F = function() { this.f1 = function() {} } F.f1 = function() {} // "static" call var v1 = F.f1(); // prototype call var f = new F(); var v2 = f.f1(); var F=函数(){ this.f1=函数(){} } F.f1=函数(){} //“静态”呼叫 var v1=F.f1(); //原
var
和this
变量不共享相同的空间。是的,这是有效的
在您的示例中,F
是一个函数,您可以为其分配一个名为f1
的属性,该属性本身就是一个函数。如果要将代码更改为读取f=new f()
,则f
是一个从f
的原型继承的对象,但它们仍然是两个不同的对象。是的,这是有效的
在您的示例中,F
是一个函数,您可以为其分配一个名为f1
的属性,该属性本身就是一个函数。如果要将代码更改为读取f=new f()
,则f
是从f
的原型继承的对象,但它们仍然是两个不同的对象。这是有效的。正如其他人所说,这里没有与原型相关的问题。
将2个属性Yes附加到2个不同的对象:
- 所谓的“静态”函数附加到函数定义(F)中
- 所谓的“public”函数附加到构造函数返回的对象(new F())
F!==新的F()
,他们是两个不同的东西,拥有不同的道具
如果你想利用原型继承,你可以考虑下面的例子:
var F = function(){}
// function visible to all of F's instances
F.prototype.f1 = function(){console.log("I'm inherited!");}
// a so called "static" function
F.f1 = function(){console.log("I'm static!");}
var instance1 = new F();
var instance2 = new F();
// function visible only to this instance of F
instance1.f1 = function(){console.log("I'm visible only to this instance of F");}
它是有效的。正如其他人所说,这里没有与原型相关的问题。
将2个属性Yes附加到2个不同的对象:
- 所谓的“静态”函数附加到函数定义(F)中
- 所谓的“public”函数附加到构造函数返回的对象(new F())
F!==新的F()
,他们是两个不同的东西,拥有不同的道具
如果你想利用原型继承,你可以考虑下面的例子:
var F = function(){}
// function visible to all of F's instances
F.prototype.f1 = function(){console.log("I'm inherited!");}
// a so called "static" function
F.f1 = function(){console.log("I'm static!");}
var instance1 = new F();
var instance2 = new F();
// function visible only to this instance of F
instance1.f1 = function(){console.log("I'm visible only to this instance of F");}
它的原型中没有
F
(至少我觉得措辞令人困惑)。它继承了F
的原型…谢谢Felix。我每天都在处理这些东西,但我仍然觉得它令人困惑。它的原型中没有F
(至少我觉得措辞令人困惑)。它继承了F
的原型…谢谢Felix。我每天都在处理这些东西,但我仍然感到困惑。实际上,在这个例子中没有任何与原型相关的东西。@Felix Kling-然后我非常困惑。我原以为var F=function(){this.f1(){…}}
中的f1()
与F.prototype.f1=function(){…}
@August Lilleaas是一样的-有效的,因为它们的命名空间没有重叠,qed,它们是两个不同的functions@ccyoung:不,不是F.prototype
是一个对象,所有新对象都将从中继承。但是使用this.f1=…
将函数分配给每个新元素(每个元素都有自己的函数)。它看起来相同,但对象结构不同。看看这个例子的输出(控制台):@Felix Kling-这很有意义-谢谢你的清晰!在这个例子中,实际上没有任何与原型相关的东西。@Felix Kling-那么我很困惑。我原以为var F=function(){this.f1(){…}}
中的f1()
与F.prototype.f1=function(){…}
@August Lilleaas是一样的-有效的,因为它们的命名空间没有重叠,qed,它们是两个不同的functions@ccyoung:不,不是F.prototype
是一个对象,所有新对象都将从中继承。但是使用this.f1=…
将函数分配给每个新元素(每个元素都有自己的函数)。它看起来相同,但对象结构不同。看看这个例子的输出(控制台):@Felix Kling-这很有意义-谢谢你的清晰!“专用”f1(如上定义)和您定义的“原型”f1之间有什么区别?在我看来,从传统的对象命名法来看,“private”是不正确的。任何人都可以访问this.f1=
,而真正的“私有”声明应该是var f1=
。定义冲突:P.“私有”函数覆盖原型函数(仅适用于当前实例)。当您调用obj.method()
时,如果当前对象中没有定义该方法(例如我们的“private”),javascript会查找obj的原型链并搜索该方法。sry,即编写public的指令(我认为它是private,其方式与该实例不同)。更正了答案。问:关于这一点,“私人”f1(如上定义)和您定义的“原型”f1有什么区别?在我看来,从传统的对象命名法来看,“private”是不正确的。任何人都可以访问this.f1=
,而真正的“私有”声明应该是var f1=
。定义冲突:P.“私有”函数覆盖原型函数(仅适用于当前实例)。当您调用obj.method()
时,如果当前对象中没有定义该方法(例如我们的“private”),javascript会查找obj的原型链并搜索该方法。sry,即编写public的指令(我认为它是private,其方式与该实例不同)。更正了答案。关于那件事