Każdy obiekt JavaScript ma własnych właściwości i dziedziczonych. Własne są zdefiniowane bezpośrednio w instancji, a dziedziczone są pobierane z obiektu prototype
.
Podczas korzystania z obiektu o właściwościach dostępu , JavaScript najpierw wyszukuje w obiekcie własna lista obiektów . Jeśli właściwość nie zostanie znaleziona, wyszukuje w prototypowym łańcuchu obiektu .
W tym przykładzie metoda wrapper()
definiuje na instancji obiektu własną właściwość doABC
, która jest funkcją informującą o 'in wrapper'
. Nawet jeśli obiekt ma prototyp z tą samą właściwością, doAbc
, który alarmuje 'in Model'
, JavaScript i tak będzie używał własnej właściwości.
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();
Jako dodatek, własność własną można usunąć za pomocą operatora delete
. Po usunięciu obiekt użyje odziedziczonej właściwości.
// delete the own property "doABC"
delete a['doABC'];
// the inherited "doABC" will be used. Alerts "in Model"
a.doABC();
Sprawdź pełna working demo.
'Model' jest' obiektem', a 'obiekt' nie może mieć dwóch kluczy o tej samej nazwie! – Rayon
@Rayon: 'shadow', a nie' override', aby użyć lepszej terminologii. OP nie przypisuje właściwości "Modelowi" dwukrotnie, przypisuje mu "Model" i prototyp. –
@JeremyJStarcher, True .. Termin "przesłanianie" źle zinterpretuje rzeczy .. – Rayon