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? ? ?
Sebelum menjawab soalan anda, mari lihat contoh
Mari pecahkan masalah anda satu persatu (sila gunakan alat pembangun penyemak imbas Chrome untuk mengesahkan)
Apakah output B.callname()?
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.
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
a.callname() Apakah yang dihasilkannya?
a sendiri ialah contoh objek, yang ditakrifkan dalam JSON. Kod di atas adalah bersamaan dengan
Pemanggil nama panggilan ialah a, maka ini dalam nama panggilan ialah a
(B() baharu).nama panggilan() Apakah yang dikeluarkannya?
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.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.