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

Object.create与new的原型继承差异:为何前者无法访问原型成员?

为什么用Object.create()创建的对象无法访问原型属性/方法,而new关键字却可以?

这问题其实是搞混了Object.create()的参数要求和new关键字的工作逻辑,咱们一步步拆解清楚:

1. 你代码里的核心问题

你写的var Stanley = Object.create(Greeting),这里传入的参数是构造函数Greeting本身,而不是它的原型对象Greeting.prototype——这就是为啥找不到byeBye方法的关键。

2. Object.create()到底做了什么?

Object.create(proto)的作用很直接:创建一个新对象,让这个新对象的内部原型([[Prototype]])直接指向你传入的proto参数。

在你的代码里,Stanley的原型链是:
Stanley -> Greeting(函数对象) -> Function.prototype -> Object.prototype -> null
而你定义的byeBye方法是挂在Greeting.prototype上的,这条链里根本找不到它,自然会报错。

3. new关键字的工作流程

当你用new Greeting()创建对象时,JS引擎会自动完成这几步:

  • 创建一个空对象,让它的内部原型直接指向Greeting.prototype
  • 把这个空对象作为this,调用Greeting构造函数
  • 如果构造函数没有返回自定义对象,就返回这个刚创建的对象

所以new出来的对象的原型链是:
实例 -> Greeting.prototype -> Object.prototype -> null
顺着这条链,就能轻松找到byeBye方法了。

4. 用Object.create()实现同样效果的正确写法

如果想用Object.create()达到和new一样的原型链效果,你需要把Greeting.prototype作为参数传入:

var Stanley = Object.create(Greeting.prototype)
console.log(Stanley.byeBye()) // 会输出 "Have a good day!"

这样Stanley的原型就直接指向Greeting.prototype,自然能访问到上面的方法了。

内容的提问来源于stack exchange,提问作者Vaibhav Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:15:40