搜尋

首頁  >  問答  >  主體

javascript - js中單例模式疑惑

以下程式碼

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

怪我咯怪我咯2827 天前762

全部回覆(6)我來回復

  • 某草草

    某草草2017-06-30 10:00:37

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

    回覆
    0
  • 扔个三星炸死你

    扔个三星炸死你2017-06-30 10:00:37

    @mpccc 說的對。

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

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

    回覆
    0
  • 过去多啦不再A梦

    过去多啦不再A梦2017-06-30 10:00:37

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

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

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

    所以uni2 === uni.

    回覆
    0
  • 迷茫

    迷茫2017-06-30 10:00:37

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

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

    回覆
    0
  • ringa_lee

    ringa_lee2017-06-30 10:00:37

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

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

    回覆
    0
  • 阿神

    阿神2017-06-30 10:00:37

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

    回覆
    0
  • 取消回覆