当函数重新定义自身时,原型会发生什么?

时间:2013-01-04 13:59:14

标签: javascript prototype

我在Stoyan Stefanov的JavaScript Patterns一书中看到了以下代码(编辑以消除额外的脂肪):

function Universe() {
    var instance = this;
    Universe = function() {
        return instance;
    }
}

Universe.prototype.nothing = true;
var uni = new Universe();
Universe.prototype.everything = true;
var uni2 = new Universe();

uni.nothing;     // true
uni2.nothing;    // true, but I was expecting undefined
uni.everything;  // undefined
uni2.everything; // undefined, but I was expecting true

我期望将nothing分配给原始函数的原型,并将everything分配给闭包的原型(因为第二次赋值在重新定义之后发生)。然而,输出结果表明发生了奇怪的事情,而这本书并没有解释它。我也注意到了:

    正如我所料,
  1. Universe.prototype确实在重新定义函数后指向了另一个对象。
  2. 重新定义后创建的其他实例仍将原始原型对象作为其__proto__。这就是我不明白的地方。
  3. 有人可以解释一下吗?

2 个答案:

答案 0 :(得分:5)

这是一个单身人士模式。第一次创建Universe时,将重新定义Universe符号。 (但它仍然存在于一种不稳定的情况:实例有一些参考。例如,在非严格模式下__proto__。)

新的Universe符号实际上不是构造函数,它只返回第一个创建的实例。第二个调用中的new关键字创建一个新实例,第二个Universe作为原型,但新函数只是忽略它并返回存储的第一个实例。

答案 1 :(得分:3)

uniuni2是同一个对象,因为在instance函数的两个版本中都会返回Universe的值。

以下是重新定义的instance返回的相同代码,但没有Universehttp://jsfiddle.net/nmaBn/