Qualsiasi oggetto JavaScript ha proprio e proprietà ereditate. Proprio sono quelli definiti direttamente nell'istanza e ereditato sono presi dall'oggetto prototype
.
Quando si utilizza un accessorio di proprietà , le prime ricerche di JavaScript nell'elenco proprietà dell'oggetto. Se la proprietà non viene trovata, cerca nella catena di prototipi dell'oggetto.
Nell'esempio, il metodo wrapper()
definisce sull'istanza dell'oggetto una proprietà doABC
, che è una funzione che avvisa 'in wrapper'
. Anche se l'oggetto ha un prototipo con la stessa proprietà doAbc
che avvisa 'in Model'
, JavaScript utilizzerà comunque la proprietà.
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();
In aggiunta, la proprietà può essere rimosso utilizzando delete
operatore. Dopo l'eliminazione, l'oggetto utilizzerà la proprietà ereditata.
// delete the own property "doABC"
delete a['doABC'];
// the inherited "doABC" will be used. Alerts "in Model"
a.doABC();
Verificare l'intero working demo.
fonte
2016-05-06 05:07:02
'Modello' è un' oggetto' e un 'oggetto' non può avere 2 chiavi con lo stesso nome! – Rayon
@Rayon: 'shadow', non' override', per usare una terminologia migliore. L'OP non sta assegnando una proprietà a 'Model' due volte, sta assegnando a' Model' e al prototipo. –
@JeremyJStarcher, True. Il termine "override" interpreterà male le cose .. – Rayon