2017-10-09 78 views
1

以下代码演示了JavaScript中属性查找的“标准”规则。它创建一个空对象a,其原型包含属性i。阅读a.i给出了原型的价值,但是写在a.i对象本身创建一个新的属性:JavaScript属性查找规则有哪些例外情况?

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 

但是,如果我们在原型二传手,该行为是不同的。写a.i现在调用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 

原型setter的存在已经完全改变了写a.i会发生什么。是否有任何其他语言功能可以改变访问属性时发生的情况?特别是,除了存在setter之外,写操作是否总是直接更新对象?

+0

的吸气剂(或普通数据属性)的存在也“彻底改变”访问属性时,会发生什么:所以,你可以做

const target = {}; const proxyHandler = { set(target, property, value, receiver) { //gets called on any setter operation } }; const proxy = new Proxy(original, proxyHandler); 

很多更在这里。我不确定为什么你会称之为“例外”。 – Bergi

回答

相关问题