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

bfa*_*tto 4 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
Run Code Online (Sandbox Code Playgroud)

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

  1. Universe.prototype 正如我所料,在重新定义函数后,它会指向不同的对象.
  2. 重新定义后创建的其他实例仍然将原始原型对象作为其原型__proto__.这就是我不明白的地方.

有人可以解释一下吗?

Oda*_*ick 5

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

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