javascript - Keraguan tentang mod tunggal dalam js
怪我咯
怪我咯 2017-06-30 09:58:37
0
6
739

Kod berikut

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

Klik untuk melihat teks asal

Soalan:

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

Jadi dalam var instance = this;, adakah ini merujuk kepada objek yang berbeza o? Jadi selepas menulis semula pembina, bukankah contoh yang dikembalikan adalah objek yang berbeza? Kenapa mereka sama pada akhirnya

怪我咯
怪我咯

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

membalas semua(6)
某草草

Oleh kerana selepas menulis semula pembina, objek dikembalikan. Objek ini akan menimpa objek yang anda hasilkan dengan pembina baharu

扔个三星炸死你

@mpccc betul.

Jika pembina mengembalikan objek, maka objek baharu akan menjadi objek.

Anda boleh lihat bahagian pembina dalam Secret Garden

过去多啦不再A梦

Saya juga masih baru, jadi saya akan cuba menjawabnya, jangan salahkan saya jika saya salah

Pertama, adakah ini merujuk kepada objek yang berbeza
Apabila pembina dipanggil buat kali pertama, objek kosong dijana, dan ini di dalam fungsi menghala ke objek kosong ini, kemudian kod itu dilaksanakan, dan akhirnya objek ini dikembalikan , iaitu uni.

Semasa panggilan kedua, disebabkan penulisan semula fungsi pertama, penutupan telah dijanakan. Contoh dalaman penutupan ini hanya menunjuk ke objek yang dijana semasa panggilan pertamauni,当第二次执行new Universe()的时候你执行的是一个闭包,也会产生一个空的对象,但那个对象并没有用到它,反而是直接返回了闭包内部的instance也就是uni Apabila pelaksanaan kedua new Universe(). , anda melaksanakan penutupan, yang juga akan menjana objek kosong, tetapi objek itu tidak menggunakannya sebaliknya, ia secara langsung mengembalikan contoh di dalam penutupan, iaitu

.

uni2 === uniJadi

.🎜
迷茫

Soalan lain, menulis corak tunggal seperti ini agak berlebihan Untuk mencipta objek unikanda tidak perlu mencipta pembina

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

Tidakkah anda menulis komen dan menulis semula pembina Selepas anda mencipta baharu sekali, anda tidak akan mempunyai baris kod var instance = this;, dan instance itu secara semula jadi akan kekal tidak berubah

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

Dilaksanakan buat kali pertamanew Universe()的时候,确实产生了一个新的this,并且将Universe构造函数改写了,之后再次调用这个new Universe()的时候,就只会return instance, tiada objek baharu akan dihasilkan.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan