4

私はコンストラクターを持っていますMonkey()

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

私は、その人が持っている車の数と、持っているすべてのプロパティ(like and)を格納する追加のプロパティで名前付けられHuman()た別のコンストラクターを作成したいと思います。carsMonkeynameage

Monkey私は新しいものですべてのものを繰り返したくありませんHumanプロトタイプMonkeyでプロパティを複製して拡張することは可能ですか?

4

3 に答える 3

7

私はこのコードを試しました、私はそれがあなたが望むものだと思います:

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

このように、Humanコンストラクターはコンストラクターを通常の関数として呼び出しますMonkeyが、その名前空間を新しいHumanオブジェクトとして設定します。したがって、この場合、コンストラクターthis内のキーワードMonkeyはクラスのオブジェクトを参照しますがHuman、ではありませんMonkey.。また、このコードでは、コンストラクターを使用するだけで、の新しいインスタンスを返さないため、条件new Human() instanceof Human;が返されます。trueMonkey

また、あなたが言ったように、あなたはプロトタイプを「クローン」することができます。これを行うだけです:

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

私は単に他のものを補完するためにこの答えを書いています、あなたが非標準を使用することの影響を完全に知っていない限り、それは使用されるべきではありません__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 に答える