function People() {
}
People.prototype.say = function () {
alert("hello");
}
function Student() {
}
Student.prototype = new People();
var superSay = Student.prototype.say;
Student.prototype.say = function () {
superSay.call(this); // 为什么会是"hello"?
alert("stu-hello");
}
var s = new Student();
s.say();
superSay.call(this)
为什么会是People.prototype.say
函数被调用?this
tunjuk?
Ini menunjukkan
Student{}
类,这个你可以在superSay.call(this)
上面加一行console.log(this)
untuk pengesahan.Kemudian, mari lihat kod ini
Untuk kemudahan penjelasan kemudian, saya memanggil contoh yang dibuat oleh
Jadi sebenarnyaOrang baharu()
di siniInstance X
.new People()
创建的实例称为实例X
。由于
superSay = Student.prototype.say
,因为上面的Student.prototype = new People();
,所以其中Student.prototype
为实例X
。所以实际上
superSay
调用的是实例X
的say
,而并非People.prototype.say
SebabsuperSay = Student.prototype.say
, keranaStudent.prototype = new People();
, jadi di manaStudent.prototype
adalahInstanceX
.superSay
memanggilsay
Instance X
, bukanPeople.prototype.say
.People.prototype.say
,主要还是原型链的问题。实例X
是People类的一个实例,所以实例X
的所有方法会从People类的原型链“继承”(用继承这个词,但是实际上JS的原型链和继承还是有些区别的)。所以实例X.say
如果没有针对实例X
重写say
方法,那么实例X
的say
就和People.prototype.say
Mengapa anda fikir ia sama dengan memanggilsuperSay.call(this)
这个里面的call
,只是改变了this
的上下文而已。但是由于superSay
即实例X.say
,这个方法里根本没有this
,所以this
Selain itu,Masalah ini sering dihadapi dalam js
Pendapat peribadi: Mari kita bincangkan tentang urutan carian untuk mencari kaedah sebut: s——student.prototype——people.prototype——Objek telah sedia dan berhenti mencari. Digabungkan dengan kod anda, katakan hanya akan menemui student.prototype. Di sini anda boleh menukar kod anda terlebih dahulu supaya kelihatan seperti ini untuk menjadikannya lebih jelas:
Yang lain kekal tidak berubah. Pada masa ini, s.say() - mengeluarkan 321, s.jiao() - mengeluarkan 456. Kemudian kembali ke kod anda, kerana anda telah mengatasi kaedah sdudent.prototype.say, jadi kod ini akan dilaksanakan
Ayat pertama superSay.call(this), pertama sekali, superSay ialah pembolehubah, dan jenis pembolehubah ialah fungsi Anda boleh menambah sekeping kod console.log(typeof supperSay) selepas var superSay = Student.prototype.say. , jadi anda hanya Panggil fungsi ini, dan pembolehubah ini menyimpan Student.prototype.say. Laksanakan kepada var superSay = Student.prototype.say. Sebenarnya, nilai yang diberikan di sini ialah People.prototype.say. Perkara ini serupa pada halaman 166-167 Elevation. Mengenai perkara ini, anda boleh menukar kedua-dua bahagian kod anda kepada ini, meninggalkan yang lain tidak berubah.
Ralat akan dilaporkan apabila memanggil superSay pada masa ini, kerana apabila var superSay = Student.prototype.say dilaksanakan; student.prototype hanya mempunyai satu atribut pembina dan tiada kaedah sebut. Kemudian kembali ke kod anda dan People.prototype.say akan diberikan kepada superSay
Ikat ini dalam pembina superSay kepada Student.prototype.
Adakah anda tidak takut bahawa poster itu akan tertipu oleh semua ceramah di tingkat atas?
Dalam programnya, stuSay menunjuk kepada fungsi objek fungsi tanpa nama () {alert("hello");}. , ia akan sentiasa menjadi seperti ini, untuk siapa ini menunjuk ke dalam badan fungsi, sila baca buku Badak...