çağırmaz. Nedenini bilmiyorumJavaScript Ben bir yöntemi geçersiz kılmak denemek ve script prototip yöntemi
cevap
Herhangi bir JavaScript nesnesinin kendi ve devralındı özellikleri vardır. Own, doğrudan örnekte tanımlı olan ve devralınmış nesnesinin prototype
nesnesinden alınmıştır.
property accessor kullanırken, JavaScript öncelikle, nesnenin kendi emlak listesini arar. Özellik bulunmazsa, nesnenin prototip zincirindeki zincirini arar.
Örneğinizde, wrapper()
yöntemi, nesne örneğini, 'in wrapper'
bildiren bir işlev olan kendi özelliği doABC
tanımlamaktadır. Nesne, 'in Model'
bildiren aynı özellik doAbc
bir prototip olsa bile, JavaScript zaten kendi özelliğini kullanacaktır. ilave olarak düzenlendiği
function wrapper(target) {
// Define an own property "doABC"
target.doABC = function() {
alert('in wrapper');
};
return target;
}
function Model() {
wrapper(this);
}
// Define an inherited property "doABC"
Model.prototype.doABC = function() {
alert('in Model');
};
var a = new Model();
//Use the own property "doABC". The inherited "doABC" is ignored.
a.doABC();
, kendi mülkiyet
delete
operatörü kullanılarak temizlenebilir. Silme işleminden sonra, nesne miras alınan özelliği kullanacaktır.
// delete the own property "doABC"
delete a['doABC'];
// the inherited "doABC" will be used. Alerts "in Model"
a.doABC();
working demo ürününü kontrol edin.
Cevabınız için teşekkürler! – user3468795
Bu komut dosyasını hata ayıklamaya çalıştım. Target.doABC deyimini çalıştırmadan önce, nesne a zaten prototip gelen doABC() yöntemine sahiptir.Target.doABC çalıştırıldıktan sonra bu işlev güncellenir. – user3468795
@ user3468795 Evet, bu şekilde yapıcıda olur. Cevabım 'sonuç sarıcıda 'sorusudur. Nedenini bilmiyorum? –
açıklayabilirim bakayım:
Burada doABC
iki ayrı sürümü var. Sizin target.doABC
sizin Model
ait o örneğine özgü bir işlev oluşturur ve her Model
kendi doABC
olsun.
Model
'un doABC
olması nedeniyle, JavaScript altyapısının başka bir şey için 'zincire yukarı' bakmaya ihtiyacı yoktur, dolayısıyla Model.prototype.doABC
sürümüne asla bakmaz. Ancak o
Model.prototype.doXYZ = function() {
alert('in Model');
};
sonra kendisine ait doXYZ
yok a
yana
a.doXYZ();
çağıran ve onu zinciri görünecektir:
Sen bu satırları ekleyerek bunu görebilirsiniz ve prototipte yöntemi gör.
'Model' bir' object' ve 'object' aynı ada sahip 2 anahtar olamaz! – Rayon
@Rayon: 'shadow', daha iyi bir terminoloji kullanmak için 'geçersiz kıl' değil. OP, 'Model'e iki kez bir özellik atamaz,' Model 've prototipe atar. –
@JeremyJStarcher, True .. 'Geçersiz kılma' terimi yanlış yorumlayacaktır .. – Rayon