簡體   English   中英

JavaScript屬性查找規則有哪些例外?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM