如何在JavaScript中克隆构造函数?

San*_*mar 4 javascript

我有一个构造函数Monkey():

function Monkey(name, age) {
    this.name = name;
    this.age = age;
}
Run Code Online (Sandbox Code Playgroud)

我想创建另一个以Human()额外属性命名的构造函数,该属性cars将存储该人拥有的汽车数量以及Monkey具有(如)的所有属性nameage

我不想重复MonkeyHuman内容中的所有内容.是可以克隆Monkey并与扩展属性的原型

Dan*_*nte 6

我试过这段代码,我想这就是你想要的:

function Human(name,age,cars){
    Monkey.call(this,name,age);
    this.cars = cars;
}
Run Code Online (Sandbox Code Playgroud)

这样,Human构造函数将Monkey构造函数作为普通函数调用,但将其命名空间设置为新Human对象.因此,在这种情况下,this关键字内部Monkey构造函数引用类的对象Human,而不是Monkey.,使用此代码,条件new Human() instanceof Human;返回true,因为我没有返回新的实例Monkey,只是使用它的构造函数.

此外,正如您所说,您可以"克隆"原型.这样做:

Human.prototype = Monkey.prototype;
Run Code Online (Sandbox Code Playgroud)

编辑

正如@Bergi amd所建议的那样,克隆原型的最佳方法是使用Object.create方法,如下所示:

Human.prototype = Object.create(Monkey.prototype, {constructor:{value:Human}});
Run Code Online (Sandbox Code Playgroud)

  • `Human.prototype = Object.create(Monkey.prototype,{constructor:{value:Human}});`会更好,否则所有的猴子都是`instanceof Human`和`(new Human).constructor`就是猴子. (2认同)