[英]What exceptions are there to the JavaScript property lookup rules?
以下代碼演示了JavaScript中屬性查找的“標准”規則。 它創建一個空對象a
,其原型包含屬性i
。 讀取ai
會給出原型的值,但是寫入ai
會在對象本身中創建一個新屬性:
function A() {}
A.prototype = { i: 1 }
a = new A();
console.log(a.i, a.hasOwnProperty('i')); // 1 false
a.i = 2
console.log(a.i, a.hasOwnProperty('i')); // 2 true
但是,如果原型中有二傳手,則行為會有所不同。 現在編寫ai
調用setter,而不是直接寫入對象:
function A() {}
A.prototype = { set i(value) { this._i = value }, _i: 1 }
a = new A();
console.log(a.i, a.hasOwnProperty('i')); // undefined false
console.log(a._i, a.hasOwnProperty('_i')); // 1 false
a.i = 2
console.log(a.i, a.hasOwnProperty('i')); // undefined false
console.log(a._i, a.hasOwnProperty('_i')); // 2 true
原型中設置器的存在已完全改變了在寫給ai
時發生的事情。 是否有其他語言功能會更改訪問屬性時發生的情況? 特別是,除了存在setter之外,寫入是否總是直接更新對象?
一個例外是,如果您的對象是代理,則可以攔截對對象的所有屬性調用,並獲得被調用屬性的名稱。 您也可以控制許多其他行為。 所以你可以做
const target = {};
const proxyHandler = {
set(target, property, value, receiver) {
//gets called on any setter operation
}
};
const proxy = new Proxy(original, proxyHandler );
這里有更多內容: https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Proxy
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.