我在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
分配给闭包的原型(因为第二次赋值在重新定义之后发生)。然而,输出结果表明发生了奇怪的事情,而这本书并没有解释它。我也注意到了:
Universe.prototype
确实在重新定义函数后指向了另一个对象。__proto__
。这就是我不明白的地方。有人可以解释一下吗?
答案 0 :(得分:5)
这是一个单身人士模式。第一次创建Universe时,将重新定义Universe符号。 (但它仍然存在于一种不稳定的情况:实例有一些参考。例如,在非严格模式下__proto__
。)
新的Universe符号实际上不是构造函数,它只返回第一个创建的实例。第二个调用中的new关键字创建一个新实例,第二个Universe作为原型,但新函数只是忽略它并返回存储的第一个实例。
答案 1 :(得分:3)
uni
和uni2
是同一个对象,因为在instance
函数的两个版本中都会返回Universe
的值。
以下是重新定义的instance
返回的相同代码,但没有Universe
:http://jsfiddle.net/nmaBn/