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
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
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 pertama
.uni
,当第二次执行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, iaituuni2 === uni
JadiSoalan lain, menulis corak tunggal seperti ini agak berlebihan Untuk mencipta objek unikanda tidak perlu mencipta pembina
.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
Dilaksanakan buat kali pertama
new Universe()
的时候,确实产生了一个新的this
,并且将Universe
构造函数改写了,之后再次调用这个new Universe()
的时候,就只会return instance
, tiada objek baharu akan dihasilkan.