Любой объект JavaScript имеет собственный и унаследован объектов недвижимости. Собственные - это те, которые определены непосредственно на экземпляре, и унаследовано взяты с объекта prototype
.
При использовании property accessor JavaScript выполняет поиск в объекте собственный список недвижимости. Если свойство не найдено, оно ищет в цепочке прототипов объекта.
В вашем примере метод wrapper()
определяет у экземпляра объекта собственное свойство doABC
, которое является функцией, которая оповещает 'in wrapper'
. Даже если у объекта есть прототип с тем же свойством doAbc
, который оповещает 'in Model'
, JavaScript в любом случае будет использовать собственное свойство.
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();
В дополнении, собственное свойство может быть удален с использованием delete
оператора. После удаления объект будет использовать унаследованное свойство.
// delete the own property "doABC"
delete a['doABC'];
// the inherited "doABC" will be used. Alerts "in Model"
a.doABC();
Отметьте working demo.
«Модель» - это «объект», а «объект» не может иметь 2 ключа одинакового имени! – Rayon
@Rayon: 'shadow', а не' override', чтобы использовать лучшую терминологию. ОП не присваивает свойство «Модели» дважды, он назначает «Модель» и прототип. –
@JeremyJStarcher, True .. Термин 'override' будет неверно истолковывать вещи. – Rayon