Этот вопрос является продолжением другого, который я задал здесь: Как перехватить и изменить конкретное свойство любого объекта
Это метод, используемый для перехвата любого свойства объекта с определенным именем с целью изменения значения или выполнения определенного действия, когда оно присваивается или читается:
Object.defineProperty(Object.prototype, "my_property", {
set: function (value) {
this._value = value;
},
get: function () {
return "changed";
}
});
var some_object = {};
some_object.my_property = "unchanged";
document.body.innerHTML += some_object.my_property;
My property value is:
Хотя этот метод отлично работает для значений, присвоенных свойствам или прочитанных из них после создания объекта, например:
var some_object = {}; // or new Object()
some_object.some_property = "some_value"; // triggers setter
console.log(some_object.some_property); // triggers getter
Он не вызовет геттер и сеттер, если свойство было инициализировано вместе с объектом с использованием литеральной записи, например:
var some_object = {some_property: "some_value"}; // does not trigger setter
console.log(some_object.some_property); // does not trigger getter
Как я могу адаптировать предыдущую стратегию, чтобы она также могла работать с литеральной записью, или есть другой способ добиться этого, используя совершенно другой метод? Возможно, путем перехвата создания любого объекта через литеральную нотацию, подобно обезьяне, исправляющей функцию Object.create()?
Имейте в виду, что это предназначено только для нацеливания свойства с известным именем на любой неизвестный объект.