1

簡単な JavaScript 継承プロトタイプを作成しましたが、問題が発生しています。正しい宣言を教えてくれる人はいますか?

コード:

var Man = function(params){
  this.name = params.name,
  this.age = params.age,
  this.job = params.job;
}

Man.prototype.work = function(){
  return this.name +' is working as a ' + this.job;
}

var Women = function(params){
  this.name = params.name,
  this.age = params.age,
  this.job = params.job;
}

Women.prototype = new Man(); //assigning the prototype

var man1 = new Man({name:'man1',age:'age1',job:'job1'});
console.log(man1.work()); //it works

var woman1 = new Women({name:'woman1',age:'age2',job:'job2'});
console.log(woman1.work()); // it is not.. why?

私が得ているエラー:

TypeError: params is undefined
[Break On This Error]   

this.name = params.name,
4

2 に答える 2

4

Man引数なしで呼び出しているため、このエラーが発生しています。

Women.prototype = new Man();

paramsis は関数内なのでundefined、アクセスするparams.nameと例外が発生します。

これが、プロトタイプをこのように設定するのが不便な理由の 1 つです。Man現時点では、 の新しいインスタンスを実際に作成する必要はありません。そのプロトタイプをプロトタイプ チェーンに接続するだけです。

Object.create [MDN] (ポリフィルを含む) を使用して、特定のプロトタイプを持つオブジェクトを作成することをお勧めします。

Women.prototype = Object.create(Man.prototype);
Women.prototype.constructor = Women;

そして内部Womenで、引数を渡すために親コンストラクターを呼び出します (下品なジョークを意図したものではありません)。

function Women(params) {
    Man.call(this, params);
}
于 2013-01-17T12:24:25.573 に答える
1

パラメータを女性から男性に渡していません。これを試してください:

Women.prototype = new Man({name:this.name,age:this.age,job:this.job});

実際、これも機能します:

Women.prototype = new Man(this);

利点は、4 文字の余分なコードであり、JS をサポートするすべてのブラウザーで動作することです

于 2013-01-17T12:21:58.473 に答える