4

我有一个构造函数Monkey()

function Monkey(name, age) {
    this.name = name;
    this.age = age;
}

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

我不想重复Monkey新东西中的所有Human东西。是否可以使用原型克隆Monkey和扩展属性?

4

3 回答 3

7

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

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}});
于 2013-01-14T03:23:58.893 回答
0

功能风格/寄生继承的简单开始:

function Human(name, age, cars) {
  var that = new Monkey(name, age);
  that.cars = cars;
  return that;
}

正如道格拉斯·克罗克福德所概述的

http://www.crockford.com/javascript/inheritance.html

于 2013-01-14T03:28:19.220 回答
0

我写这个答案只是为了补充其他答案,除非您完全知道使用 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));

也可以看看

于 2013-01-14T03:53:36.187 回答