2

同じ実装方法を共有する2つのオブジェクトを作成しようとしています:

function Human(hand,leg,head,body,foot1,foot2){

  this.hand = hand;
  this.leg = leg;
  this.head = head;
  this.body = body;
  this.feet = [foot1,foot2];
}


function Robot(hand,leg,head,body,foot1,foot2){

  this.hand = hand;
  this.leg = leg;
  this.head = head;
  this.body = body;
  this.feet = [foot1,foot2];
}

そして、私はそれらに異なるプロトタイプを持たせたい:

Human.prototype.scream = function(){ 
    alert("HUMANNN"); 
    //some other functions 
};

Robot.prototype.scream = function(){ 
     console.log("ROBOOBOT"); 
    //some other functions 
};

var Tom = new Robot(1,2,3,4,5,6);
Tom.scream();

var I = new Human(312314123,2141123,213131412,4121312,132124,12313);
I.scream();

Human関数を作成するためのより良い方法はありRobotますか?2回書く必要はありませんか?

私は試した

function Robot(hand,leg,head,body,foot1,foot2){

 Human(hand,leg,head,body,foot1,foot2);

}

var Micky = new Robot(1,2,3,4,5,6);
Micky.scream();

しかし、うまくいきませんでした。

4

5 に答える 5

1

プロパティをコンストラクターに追加する mixin 関数を作成し、適切なコンテキストで呼び出すことができます。非常に多くの引数の代わりにオブジェクトを使用することもできます。

function mixin(props) {
  for (var prop in props) {
    this[prop] = props[prop];
  }
}

function Human(props) {
  mixin.call(this, props);
}

function Robot(props) {
  mixin.call(this, props);
}

Human.prototype.scream = function() {
  console.log('Human has '+ this.legs.length +' legs'); 
};

Robot.prototype.scream = function() { 
  console.log('Robot has '+ this.legs.length +' legs'); 
};

var human = new Human({
  head: 1,
  body: 1,
  hand: 1,
  legs: [1,2],
  feet: [1,2]
});

var robot = new Robot({
  head: 1,
  body: 1,
  hand: 1,
  legs: [1,2,3],
  feet: [1,2,3]
});
于 2013-11-07T08:55:02.997 に答える
1

私は試した

function Robot(hand,leg,head,body,foot1,foot2){
    Human(hand,leg,head,body,foot1,foot2);
}

これはHuman、コンストラクターとしてではなく、インスタンスではなく関数として呼び出しますが、グローバルオブジェクトをthisとして呼び出します。使用する必要があります.call

function Robot(hand,leg,head,body,foot1,foot2) {
    Human.call(this, hand,leg,head,body,foot1,foot2);
}

または、それらを書きたくない場合は、argumentsオブジェクトとを使用できますapply:

function Robot() {
    Human.apply(this, arguments);
}

ただし、あるコンストラクターを別のコンストラクターから呼び出す代わりに、共通コードをジェネリック コンストラクターに入れ、それをHumanとの両方から呼び出すことをお勧めしRobotます。これにより、コンストラクターに特定のインスタンス初期化コードを配置することもできます。

function Humanoid (hand, leg, head, body, foot1, foot2) {
    this.hand = hand;
    this.leg = leg;
    this.head = head;
    this.body = body;
    this.feet = [foot1, foot2]
}
function Human() {
    Humanoid.apply(this, arguments);
    …
}
// if you want Humans to inherit Humanoid prototype properties:
// Human.prototype = Object.create(Humanoid.prototype);
Human.prototype.… = …;

function Robot() {
    Humanoid.apply(this, arguments);
    …
}
// if you want Robots to inherit Humanoid prototype properties:
// Robot.prototype = Object.create(Humanoid.prototype);
Robot.prototype.… = …;

関数 Human と Robot を作成して、2 回記述する必要がないようにする方法はありますか?

コンストラクターのコードが常にまったく同じであることが確実な場合は、クロージャーを使用することもできます。

function getConstructor() {
    return function Human(hand,leg,head,body,foot1,foot2) {
        this.hand = hand;
        this.leg = leg;
        this.head = head;
        this.body = body;
        this.feet = [foot1,foot2];
    }
}
var Human = getConstructor();
Human.prototype.… = …;
var Robot = getConstructor();
Robot.prototype.… = …;
于 2013-11-07T08:49:00.983 に答える