我有一个构造函数Monkey()
:
function Monkey(name, age) {
this.name = name;
this.age = age;
}
我想创建另一个以Human()
额外属性命名的构造函数,该属性cars
将存储该人拥有的汽车数量以及所有拥有的属性Monkey
(如name
和age
)
我不想重复Monkey
新东西中的所有Human
东西。是否可以使用原型克隆Monkey
和扩展属性?
我有一个构造函数Monkey()
:
function Monkey(name, age) {
this.name = name;
this.age = age;
}
我想创建另一个以Human()
额外属性命名的构造函数,该属性cars
将存储该人拥有的汽车数量以及所有拥有的属性Monkey
(如name
和age
)
我不想重复Monkey
新东西中的所有Human
东西。是否可以使用原型克隆Monkey
和扩展属性?
我试过这段代码,我想这就是你想要的:
function Human(name,age,cars){
Monkey.call(this,name,age);
this.cars = cars;
}
这样,Human
构造函数将Monkey
构造函数作为普通函数调用,但将其命名空间设置为新Human
对象。因此,在这种情况下,constructor 中的this
关键字Monkey
指的是 class 的对象Human
,而不是class 的对象。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;
}
正如道格拉斯·克罗克福德所概述的
我写这个答案只是为了补充其他答案,除非您完全知道使用 non-standard 的影响,否则不应使用它__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));
也可以看看