在javascript对象中,“静态”函数和原型函数共享相同的命名空间吗?

时间:2011-07-21 08:10:44

标签: 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();

它似乎应该没问题,因为例如,对象函数中的varthis变量不共享相同的空间。

2 个答案:

答案 0 :(得分:2)

是的,这是有效的。

在您的示例中,F是一个函数,您可以为其分配一个名为f1的属性,该属性本身就是一个函数。如果您要将代码更改为f = new F(),那么f是一个继承自F原型的对象,但它们仍然是两个不同的对象。

答案 1 :(得分:2)

有效。
像其他人所说的那样,这里没有原型相关的问题 您将2个属性附加到2个不同的对象:

  • 所谓的“静态”函数附加到函数定义(F)
  • 所谓的“public”函数附加到构造函数返回的对象(new F())

所以,从F !== new 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");}