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
函數(shù)被調用?this
tunjuk? Ini menunjukkan Student{}
類,這個你可以在superSay.call(this)
上面加一行console.log(this)
untuk pengesahan.
Kemudian, mari lihat kod ini
Student.prototype = new People();
Untuk kemudahan penjelasan kemudian, saya memanggil contoh yang dibuat oleh Orang baharu()
di sini Instance X
. new People()
創(chuàng)建的實例稱為實例X
。
由于superSay = Student.prototype.say
,因為上面的Student.prototype = new People();
,所以其中Student.prototype
為實例X
。
所以實際上superSay
調用的是實例X
的say
,而并非People.prototype.say
Sebab superSay = Student.prototype.say
, kerana Student.prototype = new People();
, jadi di mana Student.prototype
adalah InstanceX
.
superSay
memanggil say
Instance X
, bukan People.prototype.say
.
People.prototype.say
,主要還是原型鏈的問題。實例X
是People類的一個實例,所以實例X
的所有方法會從People類的原型鏈“繼承”(用繼承這個詞,但是實際上JS的原型鏈和繼承還是有些區(qū)別的)。所以實例X.say
如果沒有針對實例X
重寫say
方法,那么實例X
的say
就和People.prototype.say
Mengapa anda fikir ia sama dengan memanggil
superSay.call(this)
這個里面的call
,只是改變了this
的上下文而已。但是由于superSay
即實例X.say
,這個方法里根本沒有this
,所以this
Selain itu,
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:
People.prototype.say = function () {
console.log(123);
}
People.prototype.jiao = function () {
console.log(456);
}
Student.prototype.say = function () {
console.log(321)
}
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
Student.prototype.say = function () {
superSay.call(this); // 為什么會是"hello"?
alert("stu-hello");
}
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.
var superSay = Student.prototype.say;
Student.prototype = new People();
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
綜上第一句代碼會輸出hello,而你的call根本沒什么用
第二句就不用說了。
關于this其實我也不是特別清楚。我原來還認為console.log(this)會輸出S,結果輸出student,還需繼續(xù)學習。
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...Poster tidak akan mengalami masalah ini selepas membaca bahagian fungsi buku Rhinoceros Adapun banyak perkara karut di tingkat atas, jangan buat poster itu pening