【发布时间】:2014-09-19 09:42:39
【问题描述】:
简介:我开始阅读 Javascript Patterns 书籍,但无法掌握一个示例。它相当大,所以在给你一个代码之前,我会试着简要解释一下。
示例说明:所以他们尝试做的是在 Closure 的帮助下定义单例。第一段代码非常简单,但它有一个明显的缺点——我们无法在创建Universe 的第一个实例后重新定义原型。
问题: 有人可以解释一下第二个示例(“好”单例)代码是如何在第一次构造函数调用后设法更改原型的吗?
“坏”单例:
function Universe() {
var instance = this;
this.start_time = 0;
this.bang = "Big";
Universe = function () {
return instance;
};
}
// testing
Universe.prototype.nothing = true;
var uni = new Universe();
Universe.prototype.everything = true;
var uni2 = new Universe();
uni.nothing; // true
uni2.nothing; // true
//AS YOU CAN SEE ALL CHANGES TO UNIVERSE PROTOTYPE HAVE NO RESULT AFTER FIRST CONSTRUCTOR CALL
uni.everything; // undefined
uni2.everything; // undefined
然后他们用下面的代码解决了这个问题:
'好'单例:
function Universe() {
var instance;
Universe = function Universe() {
return instance;
};
Universe.prototype = this;
instance = new Universe();
instance.constructor = Universe;
instance.start_time = 0;
instance.bang = "Big";
return instance;
}
// testing
Universe.prototype.nothing = true;
var uni = new Universe();
//QUESTION: how does it manage to change the prototype of singleton?!
Universe.prototype.everything = true;
var uni2 = new Universe();
uni.nothing && uni.everything && uni2.nothing && uni2.everything; // true
换句话说,同样的问题:为什么在第一个代码中 sn-p uni.everything == false 和 uni2.everything == false 而在第二个代码中是 uni.everything == true 和 uni2.everything == true?至于我,在这两种情况下都应该是false
【问题讨论】:
-
当然是,它总是返回第一次创建的实例。
-
@Qantas94Heavy 你刚刚回答了哪个问题?
标签: javascript design-patterns singleton closures