2

私にはPers(on)とPersから派生した従業員がいます。

Pers = function(options){
  this.Name;
  this.ID;
  this.init = function(options){
    this.Name=options.Name;
    this.ID=options.ID;
  }
}

Employee = function(options){
  this.Sal;
  this.init = function(options){
    this.Sal=options.Sal;
    this.__proto__.init(options);
  }
  this.init(options);
}

Employee.prototype=new Pers();

今、私が新しいオブジェクトを作成するとき...

var o=new Employee({Name:"Nik",ID:"1",Sal:100});
var p=new Employee({Name:"Tanja",ID:"2",Sal:200});

彼らの名前を知らせてください、私は2回「タンジャ」を手に入れます。

誰かアイデアはありますか?

4

2 に答える 2

3
this.__proto__.init(options);

initプロトタイプ自体をとしてプロトタイプのメソッドを呼び出し、プロトタイプthisを変更します。試す

this.__proto__.init.apply(this, [options]);

編集

回避__proto__するには、シャドウする前にプロトタイプのinit関数への参照を保存できます。

Employee = function(options){
  this.Sal;
  var protoInit = this.init;
  this.init = function(options){
    this.Sal=options.Sal;
    protoInit.apply(this, [options]);
  }
  this.init(options);
}
于 2012-07-17T16:23:53.607 に答える
2

init間違ったスコープで呼び出しています。このようなことを試してください。

function Person(opt) {
    this.name = opt.name;
    this.id = opt.id;
}

function Employee(opt) {
    Person.call(this, opt);
    this.sal = opt.sal;
}

Employee.prototype = Object.create(Person.prototype, {});

Person.prototypeおよびのプロパティを設定できるようになりEmployee.prototype、期待どおりに動作するはずです。

これにより、ハッキーな非推奨プロパティ ( __proto__) の使用が回避され、より明確になるはずです。Object.createスーパーコンストラクターを実際に呼び出すことなく、スーパーコンストラクターのプロトタイプを使用してインスタンスを作成するために使用されます (init呼び出しの必要性を取り除きます)。多くのライブラリの実装がそうであるように、実行中にsuperやなどの準標準のプロパティ定義を含めることができます。constructorinherits

于 2012-07-17T16:28:38.777 に答える