在javascript对象中,执行;“静态”;函数和原型函数共享同一名称空间?

在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 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(); 它似乎应该是正常的,因为,例如,对象函数中的
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,其方式与该实例不同)。更正了答案。关于那件事