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
相关产品推荐
相关产品推荐

