cari

Rumah  >  Soal Jawab  >  teks badan

javascript - Keraguan tentang mod tunggal dalam js

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

怪我咯怪我咯2764 hari yang lalu742

membalas semua(6)saya akan balas

  • 某草草

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

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

    balas
    0
  • 扔个三星炸死你

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

    @mpccc betul.

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

    Anda boleh lihat bahagian pembina dalam Secret Garden

    balas
    0
  • 过去多啦不再A梦

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

    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 < When code>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

    .🎜

    balas
    0
  • 迷茫

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

    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)); 
     } 
    }; 

    balas
    0
  • ringa_lee

    ringa_lee2017-06-30 10:00:37

    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)

    balas
    0
  • 阿神

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

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

    balas
    0
  • Batalbalas