已知Object.create()通用用法,求问其在该JS代码中的作用
为什么这段代码里需要
apple.prototype = Object.create(fruits.prototype);? 你当前的例子里去掉这行代码能正常运行,是因为你的场景只用到了构造函数内的属性继承,但这行代码的作用远不止于此,分两部分给你解释:
1. 先搞懂fruits.call(this)的局限
fruits.call(this)属于构造函数继承,它的作用只是把fruits构造函数里通过this定义的属性(比如这里的name),直接复制到apple的实例上。所以你去掉原型那行后,app.name依然能输出,因为这个属性是直接挂在实例本身上的,和原型链没关系。
但这种继承只能拿到构造函数里的东西,拿不到fruits原型上的成员。
2. apple.prototype = Object.create(fruits.prototype);的核心作用
这行是原型链继承,它负责两件关键的事:
让
apple的实例能继承fruits原型上的方法/属性。比如给fruits.prototype加个方法试试:function fruits() { this.name = 'fruit 1'; } // 给fruits原型加一个公共方法 fruits.prototype.introduce = function() { console.log(`我是${this.name}`); } function apple() { fruits.call(this); } // 注释掉这行再运行 // apple.prototype = Object.create(fruits.prototype); const app = new apple(); app.introduce(); // 直接报错:app.introduce is not a function这时候你就会发现,没有那行原型代码,
apple实例根本找不到fruits原型上的introduce方法——因为它的原型链没和fruits.prototype连起来。维持正确的原型链关系,让
instanceof这类判断正常工作:console.log(app instanceof fruits); // 有原型代码时输出true,没有时输出false
3. 为什么你的例子去掉它也没问题?
因为你的fruits只在构造函数里定义了name属性,完全没用到原型上的成员。所以仅靠fruits.call(this)就足够满足当前需求,但一旦涉及到原型上的方法或属性,这行代码的必要性就立刻显现了。
简单总结:
fruits.call(this):管构造函数内的实例属性继承apple.prototype = Object.create(fruits.prototype):管原型上的公共成员继承,同时保证原型链的正确性
内容的提问来源于stack exchange,提问作者Haeram
相关产品推荐
相关产品推荐

