4

我在 Stoyan Stefanov 的JavaScript 模式一书中看到了以下代码(经过编辑以去除多余的脂肪):

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__. 这就是我不明白的。

有人可以解释一下吗?

4

2 回答 2

5

这是一个单例模式。首次创建 Universe 时,重新定义了 Universe 符号。(不过,它仍然存在于一种不确定状态:实例对它有一些引用。__proto__例如在非严格模式下。)

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

于 2013-01-04T14:14:10.693 回答
3

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

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

于 2013-01-04T14:14:59.263 回答