搜索

首页  >  问答  >  正文

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不就是不同的对象吗?为什么最后能相等

怪我咯怪我咯2749 天前731

全部回复(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,当第二次执行new Universe()的时候你执行的是一个闭包,也会产生一个空的对象,但那个对象并没有用到它,反而是直接返回了闭包内部的instance也就是

    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
  • 取消回复