【发布时间】:2017-10-09 12:37:54
【问题描述】:
以下代码演示了 JavaScript 中属性查找的“标准”规则。它创建一个空对象a,其原型包含一个属性i。读取a.i 会给出原型的值,但写入a.i 会在对象本身中创建一个新属性:
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
但是,如果我们在原型中有一个 setter,则行为会有所不同。写入 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
原型中设置器的存在完全改变了写入a.i 时发生的情况。是否有任何其他语言功能可以改变访问属性时发生的情况?具体来说,除了存在 setter 之外,写入是否总是直接更新对象?
【问题讨论】:
-
原型对象上的 getter(或纯数据属性)的存在也“完全改变”了访问属性时发生的情况。我不知道你为什么称它为“例外”。
标签: javascript inheritance prototype getter-setter