为什么要将构件添加到构造函数而不是原型?

时间:2011-08-26 19:55:13

标签: javascript

为什么要将成员添加到构造函数而不是原型?

function foo() {
}

foo.prototype.isThereSayShoeSize = function() {
    console.log(this.sayShoeSize);
}

foo.fooObject = {num: 100, shoeSize: 43}

foo.sayShoeSize = function() {
    console.log(foo.fooObject.shoeSize)
}

var myFoo = new foo();

console.log(myFoo.sayShoeSize);  //undefined
myFoo.isThereSayShoeSize()       //undefined

成员不是由实例拥有,也不是在实例之间共享。因此,无法通过instance.member语法或实例中的this关键字访问这些成员。

因此,似乎添加到构造函数的成员与该类型无关。

我只能想到两种可能的解释。 1通过将这些memebers分类为类型来保存命名空间空间,如果它们与类型无关,则没有多大意义。 2它们是静态成员,可以在没有类型实例的情况下访问它们。如果有其他类型的对象希望使用这些成员,则这是有意义的。但是在我看到这种模式的上下文中,这些成员仅被它们所附加类型的实例使用。所以在这种情况下,它们与类型相关并且只被类型的实例使用,那么为什么不把它们放在原型中呢?

我对你有点困惑,你可能会说。我想也许这种在构造函数中添加成员的模式在我看到它的上下文中是不合适的,并且成员应该已经添加到原型中。但你会称这些成员为静态吗?并且会有哪些成员可以使用它们所附带的类型以及其他类型的成员是这种模式的主要用途吗?

2 个答案:

答案 0 :(得分:1)

执行此操作时:

function foo() {};
foo.fooObject = {num: 100, shoeSize: 43};

它类似于在C ++世界中设置一个类变量,它可以作为foo.fooObject用于所有实例,并且对于所有实例都是相同的。它是一种设置全局变量的命名空间方式。正如您所指出的那样,它们不是实例变量,所以只有当范围全局变量是期望的结果时才应该使用此技术。

答案 1 :(得分:0)

基本上有静态方法和属性。

为什么呢?怎么样?

让我们忘记foo是用作构造函数的。添加到foo的方法是foo()函数的成员(函数也是对象,因此它们也可以有方法。)

因此,要调用这些方法,您只需访问foo函数的成员即可。这意味着

foo.sayShoeSize();

foo['sayShoeSize']();

此时,您无需使用foo运算符呼叫new。由于没有原型链的一部分,使用foo作为构造函数创建的对象不会继承这些方法和属性。这意味着:

var myFoo = new foo();

console.log(typeof myFoo.sayShowSize); // undefined

总而言之,构造函数上定义的函数不应该使用或依赖this。换句话说,this将绑定到全局对象(当然,除非使用applycall调用它们。)