以下程式碼
function Universe() {
// 缓存的实例
var instance = this;
// 其它内容
this.start_time = 0;
this.bang = "Big";
// 重写构造函数
Universe = function () {
return instance;
};
}
// 测试
var uni = new Universe();
var uni2 = new Universe();
uni.bang = "123";
console.log(uni === uni2); // true
console.log(uni2.bang); // 123
點選查看原文
問題:
new Universe()的过程是:
var o = {};
Universe.call(o);//这一步是将Universe中this对应的属性赋值给o;
o.__proto__ = Universe.prototype;//将Universe原型上的方法赋值到o的__proto__属性上;
那麼 var instance = this;
中,this是不是指的是不同的物件o?那麼重寫建構函式後,傳回的instance不就是不同的物件嗎?為什麼最後能相等
过去多啦不再A梦2017-06-30 10:00:37
我也是新手,試著解答一下,要是錯了可別怪我
第一this是不是指的是不同的對象
在第一次調用構造函數的時候產生一個空的對象並且函數內部的this指向了這個空對象,接著執行代碼,最後返回這個對像也就是uni
。
而在第二次調用的時候由於第一次函數的改寫,產生了一個閉包,這個閉包的內部的instance正好指向了第一次調用時的產生的對象uni
,當第二次執行new Universe()
的時候你執行的是一個閉包,也會產生一個空的對象,但那個對象並沒有用到它,反而是直接返回了閉包內部的instance也就是uni
。
所以uni2 === uni
.
迷茫2017-06-30 10:00:37
偏個題,這樣寫單例模式有點多餘,要創建唯一的物件不用非得造個建構子
var single = function(fn){
var instance;
return function(){
return instance || (instance = fn .apply(this, arguments));
}
};
ringa_lee2017-06-30 10:00:37
不是註解寫了嗎,重寫了建構子啊,你new了一次之後再new就沒有var instance = this;這行程式碼了,instance自然就不變了
//简单打印一下就知道了
console.log(Universe)
var uni = new Universe()
console.log(Universe)
阿神2017-06-30 10:00:37
首次執行new Universe()
的時候,確實產生了一個新的this
,並且將Universe
構造函數改寫了,之後再次調用這個new Universe()
的時候,就只會把return instance
了,不會產生新的物件了。