javascript - js中單例模式疑惑
怪我咯
怪我咯 2017-06-30 09:58:37
0
6
771

以下程式碼

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不就是不同的物件嗎?為什麼最後能相等

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回覆(6)
某草草

因為重寫了建構函式後, 回傳一個物件, 這個物件會覆蓋你 用new 建構函式產生的那個物件,不知道我有沒有說清楚

扔个三星炸死你

@mpccc 說的對。

如果建構函數回傳一個對象,那 new 出來的就是這個對象啦。

可以看看秘密花園中的構造函數這一段

过去多啦不再A梦

我也是新手,試著解答一下,要是錯了可別怪我

第一this是不是指的是不同的對象
在第一次調用構造函數的時候產生一個空的對象並且函數內部的this指向了這個空對象,接著執行代碼,最後返回這個對像也就是uni

而在第二次調用的時候由於第一次函數的改寫,產生了一個閉包,這個閉包的內部的instance正好指向了第一次調用時的產生的對象uni,當第二次執行new Universe()的時候你執行的是一個閉包,也會產生一個空的對象,但那個對象並沒有用到它,反而是直接返回了閉包內部的instance也就是uni

所以uni2 === uni.

迷茫

偏個題,這樣寫單例模式有點多餘,要創建唯一的物件不用非得造個建構子

var single = function(fn){ 
 var instance; 
 return function(){ 
     return instance || (instance = fn .apply(this, arguments)); 
 } 
}; 
ringa_lee

不是註解寫了嗎,重寫了建構子啊,你new了一次之後再new就沒有var instance = this;這行程式碼了,instance自然就不變了

//简单打印一下就知道了
console.log(Universe)
var uni = new Universe()
console.log(Universe)
阿神

首次執行new Universe()的時候,確實產生了一個新的this,並且將Universe構造函數改寫了,之後再次調用這個new Universe()的時候,就只會把return instance了,不會產生新的物件了。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板