javascript – Zweifel am Singleton-Modus in js
怪我咯
怪我咯 2017-06-30 09:58:37
0
6
727

Der folgende Code

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

Klicken Sie hier, um den Originaltext anzuzeigen

Frage:

new Universe()的过程是:
var o = {};
Universe.call(o);//这一步是将Universe中this对应的属性赋值给o;
o.__proto__ = Universe.prototype;//将Universe原型上的方法赋值到o的__proto__属性上;

Bezieht sich das in var instance = this; also auf ein anderes Objekt o? Ist die zurückgegebene Instanz nach dem Umschreiben des Konstruktors nicht ein anderes Objekt? Warum sind sie am Ende gleich?

怪我咯
怪我咯

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

Antworte allen(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了,不会产生新的对象了。

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage