我有一个构造函数Monkey()
:
function Monkey(name, age) {
this.name = name;
this.age = age;
}
我想创建另一个构造函数,名为
Human()
,并增加一个额外的属性cars
,它将存储人拥有的汽车数量以及所有Monkey
拥有的属性(如name
和age
)。我不想在新的
Human
中重复所有Monkey
的内容。是否可以使用原型克隆Monkey
并扩展属性?我有一个构造函数Monkey()
:
function Monkey(name, age) {
this.name = name;
this.age = age;
}
Human()
,并增加一个额外的属性cars
,它将存储人拥有的汽车数量以及所有Monkey
拥有的属性(如name
和age
)。Human
中重复所有Monkey
的内容。是否可以使用原型克隆Monkey
并扩展属性?function Human(name,age,cars){
Monkey.call(this,name,age);
this.cars = cars;
}
Human
构造函数将 Monkey
构造函数作为一个普通函数进行调用,但是将其命名空间设置为新的 Human
对象。因此,在这种情况下,Monkey
构造函数内部的 this
关键字指的是 Human
类的对象,而不是 Monkey
。同时,使用此代码,条件 new Human() instanceof Human;
返回 true
,因为我没有返回 Monkey
的新实例,只是使用了它的构造函数。
此外,您可以“克隆”原型,就像您所说的那样。只需执行以下操作:
Human.prototype = Monkey.prototype;
编辑
正如@Bergi amd所建议的,克隆一个原型的最佳方法是使用Object.create方法,如下所示:
Human.prototype = Object.create(Monkey.prototype, {constructor:{value:Human}});
函数式/寄生式继承的简单入门:
function Human(name, age, cars) {
var that = new Monkey(name, age);
that.cars = cars;
return that;
}
正如Douglas Crockford所概述的那样
Monkey
类型的对象,而不是 Human
类型的(参见 new Human() instanceof Human;
)。 - Danilo Valenteinstanceof
这样的东西只会将你束缚在与JavaScript不协调的范式中。 - Matt Whippleinstanceof
是一种编程实现方式。这两个对象提供了相同的功能,而这个解决方案开始时表明它倾向于“函数式”方向,这意味着该对象与数据比类型系统更相似。 - Matt Whipplenew
关键字的伪经典风格的替代方案。在代码之前有这样的说明。这是一个常见的替代方案,在反对之前应该考虑一下。它要简单得多,并且根据我的经验,可以避免许多具有强大OO背景的人因为原型继承而感到困惑。 - Matt Whipplenew
的使用更多的影响力,而实际上并不存在。如果你计划长期处理JS,你应该对两者都感到舒适。我认为你也应该停止提及使用instanceof
,因为它可能被用于强制执行契约,这会导致经典层次结构的设计不良,并给JavaScript这样一种动态语言带来虚假的安全感。 - Matt Whipple__proto__
的影响,否则不应该使用它。function Monkey(name, age) {
this.name = name;
this.age = age;
}
function Human(name, age, cars) {
this.__proto__ = new Monkey(name, age);
this.cars = cars;
}
console.log(new Human(1, 2, 3));
另请参阅
Human.prototype = Object.create(Monkey.prototype, {constructor:{value:Human}});
如果这样做,所有的猴子都会instanceof Human
而(new Human).constructor
将会是猴子。 - BergiObject.create
,那么就是Human.prototype = new Monkey(); Human.prototype.constructor = Human;
)。 - Ry-Human.prototype = new Monkey
- 因为你会得到构造函数中不适用的副作用。有更好的方法可以模拟Object.create
。 - BergiHuman.prototype = Monkey.prototype
并不会以任何方式“克隆”原型对象,它只是意味着Human.prototype
引用了Monkey.prototype
,这里只有一个对象,没有“克隆”。 - RobG