为何Object.create生成的子对象中getter会被继承为属性?
关于Object.create()与getter属性的疑问
我在探索Object.create()方法时发现一个有趣现象:当传入包含用get关键字定义的getter方法的对象时,该getter方法不仅存在于新对象的Prototype对象中,还会隐式出现在新对象本身的视图里。我原本理解Object.create()只是创建一个空对象,并将传入的参数设为新对象的原型,因此疑惑为何get方法会看起来像新对象的属性。
我的代码如下:
let obj = { fname: "hello", lname: "world", get getName() { return `${this.fname} ${this.lname}`; }, }; let newObj = Object.create(obj); console.log(newObj);
浏览器控制台显示的newObj里能看到getName,尝试访问newObj.getName时输出了"hello world",不确定这是原型链的作用,还是newObj本身就拥有getName属性。请仅从对象字面量的角度解释,不要涉及类的情况。
解答
首先明确:newObj本身并没有getName这个自有属性,控制台里的显示只是原型链上的getter被“友好展示”出来的效果,本质还是原型链在起作用,具体原因如下:
- 用对象字面量的
get关键字定义的是访问器属性(accessor property),它和普通的数据属性不一样,不会直接存储值,而是在被访问时触发对应的get函数。 Object.create(obj)确实创建了一个没有自有属性的空对象,并把obj设为它的原型。当你访问newObj.getName时,JS引擎会沿着原型链向上查找,找到原型obj上的getName访问器属性,执行其get函数后返回结果。- 浏览器控制台为了方便开发者调试,会把原型链上可枚举的访问器属性也显示在对象的视图里,但这并不代表该属性属于对象自身。你可以用
Object.hasOwn(newObj, 'getName')来验证,这个方法会返回false,直接证明getName不是newObj的自有属性。
内容的提问来源于stack exchange,提问作者Jay Mehta
相关产品推荐
相关产品推荐

