You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 16:42:19