在当前使用ES6类语法和get / set语法的JavaScript项目中,我偶然发现了一个我无法解释的行为。
首先,提取的演示按预期工作:
A级{ …
当您尝试检索属性,并且该属性不在实例上时,引擎将查找原型链 第一 链中的对象,它具有相关属性的属性描述符。当找到所述描述符时,如果它具有getter,则调用该getter。否则,如果没有getter,它将检索该属性的普通值(如果有)。
在第二种情况下,属性描述符打开 B.prototype 。但 B.prototype 没有吸气剂 value (也不是 B.prototype 有一个简单的价值 value )!所以, undefined 退回。
B.prototype
value
undefined
如果 B.prototype 有一个吸气剂 value ,它将被调用:
'use strict'; class A { constructor() { this.__value = null; } get value() { return this.__value; } } class B extends A { set value(value) { this.__value = value; } get value() { console.log('trying to get value'); } } let b = new B(); b.value = 2; b.value;
但它没有一个。引擎不会继续在原型链中寻找吸气剂 - 相反,它只会停止并返回 undefined ,因为在原型链中的第一个对象上没有找到getter(或普通值) hasOwnProperty('value') 。
hasOwnProperty('value')
如果你有一个getter,并且你希望能够设置相同的属性,那么setter必须与getter在同一个对象上,反之亦然。