javascript - Bolehkah sesiapa membantu saya melihat bagaimana program ini berfungsi?
滿天的星座
滿天的星座 2017-05-19 10:41:16
0
2
523
        var name = "this is window"
        var a = {
            name:"this is a",
            callname:function(){
                alert(this.name)
            }
        }
        function B(){
            alert(this.name)//this is B
        }
        B.prototype.name = "this is B";
        B.prototype.callname = function(){
            alert(this.name)
        }
        B.callname = function(){
            alert(this.name)
        }
        //a.callname()
        //B.callname()
        //(new B()).callname()

Apakah nilai yang diperolehi oleh tiga yang terakhir? ? ?

滿天的星座
滿天的星座

membalas semua(2)
某草草

Terdapat tiga sebab untuk kekeliruan anda:
Pertama, atribut nama yang anda takrifkan, fungsi itu sendiri mempunyai atribut sedemikian, juga dipanggil nama, yang mengelirukan pemahaman anda tentang isu ini.
Kedua, prototaip tidak difahami dengan baik: untuk sifat yang ditakrifkan dalam prototaip fungsi, hanya objek selepas instantiasi (iaitu, operasi baharu) boleh mendapatkan nilainya menggunakan kaedah "variable.property".
Ketiga, ini tidak difahami dengan baik: ini merujuk kepada objek yang memanggil kaedah

Sebelum menjawab soalan anda, mari lihat contoh

var function X() {};
console.log(X.name);  
// 输出 "X", 
// 任何函数都有一个叫做name的属性,其值为该函数名。

Mari pecahkan masalah anda satu persatu (sila gunakan alat pembangun penyemak imbas Chrome untuk mengesahkan)

  1. Apakah output B.callname()?

    function B(){
      alert(this.name);
    }
    B.prototype.name = "this is B";
    B.callname = function(){
      alert(this.name)
    };

    B ialah fungsi, namanya="B", kaedah B.callname dipanggil, dan pemanggil ialah B, maka ini dalam kaedah nama panggilan merujuk kepada B. Adakah anda masih ingat apa itu B.name? Lihat sahaja contoh pertama di atas untuk memahami.

    答案是  弹窗显示 “B”。

    Anda akan bertanya, mengapa "ini B" tidak ditakrifkan oleh B.prototype.name? Kerana sifat yang ditakrifkan dalam prototaip B hanya boleh diakses secara langsung oleh contoh B.
    Jika anda masih tidak percaya, sila tukar semua nama, seperti xname, dan jawapan kepada soalan ini akan menjadi tidak ditentukan

  2. a.callname() Apakah yang dihasilkannya?

    var a = {
      name:"this is a",
      callname:function(){    
          alert(this.name);
      }
    };

    a sendiri ialah contoh objek, yang ditakrifkan dalam JSON. Kod di atas adalah bersamaan dengan

    a.name = "this is a";
    a.callname = function() {
          alert(this.name);
    }

    Pemanggil nama panggilan ialah a, maka ini dalam nama panggilan ialah a

    答案显而易见 弹窗显示  “this is a”
    
  3. (B() baharu).nama panggilan() Apakah yang dikeluarkannya?

    function B(){
      alert(this.name);
    }
    B.prototype.name = "this is B";
    B.callname = function(){
      alert(this.name)
    };

    Mula-mula, B() baharu dilaksanakan dahulu, mencipta tika tanpa nama Mari namakannya buat sementara waktu, iaitu b = B() baharu, dalam fungsi B Ini dirujuk sebagai b pada masa ini, dan kemudian amaran kaedah dalam badan fungsi B dilaksanakan secara berurutan Apakah b.name? b ialah contoh, ia tidak mempunyai atribut nama, jadi ia akan mencari nama dalam definisi prototaip kelas induk dan mencari "ini ialah B".new B()先执行, 创建了一个匿名实例,我们暂且给他命名为b, 即 b = new B(), 函数B中的this此时被指代为 b, 然后才是依次执行B函数体内的方法alert, b.name是什么?b是个实例,它本身没有name属性, 就会去父类的prototype定义中找name,找到了 "this is B".
    然后, b.callname() Kemudian, b.callname() dilaksanakan, dan nama panggilan ditakrifkan Ini merujuk kepada pemanggil kaedah b Instance b itu sendiri tidak mempunyai atribut nama Ia akan mencari nilai atribut nama prototaip dan mengembalikannya.

    答案是它会触发两次弹窗: 第一次弹窗 “this is B”, 第二次弹窗也是“this is B”
    
迷茫

Dalam yang pertama, ini mewakili objek a, jadi timbul ini ialah
Dalam yang kedua, B mewakili fungsi B, dan apa yang muncul ialah nama fungsi B
Yang ketiga akan muncul ini adalah pertama B, kerana fungsi akan dilaksanakan apabila instantiated. Kemudian akan berlaku ralat sintaks kerana tiada koma bernoktah dalam pernyataan sebelum (B() baharu). Jika tiada ralat sintaks, satu lagi B ini akan muncul kerana objek contoh memanggil atribut nama pada objek prototaip.

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