我在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分配给原始函数的原型(prototype),并将everything分配给闭包的原型(prototype)(因为第二次分配发生在重新定义之后)。但是,输出结果表明发生了一些奇怪的事情,而这本书并没有真正解释它。我还注意到:

如我所料,
  • Universe.prototype在函数重新定义后确实指向另一个对象。
  • 重定义后创建的其他实例仍将原始原型(prototype)对象作为其__proto__。那是我不明白的。

  • 有人可以解释吗?

    最佳答案

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

    这是相同的代码,但是没有从重新定义的instance返回Universe:http://jsfiddle.net/nmaBn/

    10-04 22:48