2016-05-06 40 views

cevap

5

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.

+0

Cevabınız için teşekkürler! – user3468795

+0

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

+0

@ user3468795 Evet, bu şekilde yapıcıda olur. Cevabım 'sonuç sarıcıda 'sorusudur. Nedenini bilmiyorum? –

1

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.