【问题标题】:Difference between two prototype setting code in javascriptjavascript中两个原型设置代码之间的区别
【发布时间】:2015-08-28 11:20:45
【问题描述】:
有两段 javascript 代码示例。
第一个代码是:
var child1 = new Parent1();
child1.prototype = Object.create(Parent1);
第二个代码是:
var child2 = new Parent2();
child2.prototype = Object.create(Parent2.prototype);
那你能告诉我,它们之间有什么区别吗?
【问题讨论】:
标签:
javascript
oop
prototype
【解决方案1】:
首先 - .prototype - 是构造函数(例如函数)而不是对象的属性。这意味着,使用您的构造函数创建的所有对象都将constructor prototype property 作为prototype :)
要设置创建对象的原型,您可以使用__proto__ 属性或Object.setPrototypeOf 方法,但请注意,这两者都是新的 ES2015 标准的一部分,并非所有浏览器都完全支持。
修改后的代码如下所示
var child1 = new Parent1();
Object.setPrototypeOf(child1, Object.create(Parent1));
//vs
var child2 = new Parent2();
Object.setPrototypeOf(child2, Object.create(Parent2.prototype));
区别在于第一种情况是您将Function object 设置为原型,这有点没有意义,因为它只包含默认的函数对象属性。在第二个中,您将构造函数的原型设置为构造对象的原型,这也没有意义,因为它在构造后已经设置。
主要部分:您发布的代码并不正确且不常用。原型继承应该使用不同的。要知道如何,您可以阅读here的答案
有趣的部分:你的代码仍然是有效的 javascript,但它不会像你预期的那样工作,因为它不能使用原型继承。