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之外,写操作是否总是直接更新对象?
的吸气剂(或普通数据属性)的存在也“彻底改变”访问属性时,会发生什么:所以,你可以做
很多更在这里。我不确定为什么你会称之为“例外”。 – Bergi