0

私はそのように定義された抽象オブジェクトを持っています...

var abs = module.exports = function abs(val){

   if(!(this instanceof abs)){

      return new abs(val);

   }

   abs.prototype.getName = function getName(){

      return val.name;

   }

}

そして、そのように定義されたそれから継承したい具象クラス...

 var concrete = module.exports = function concrete(val){

    var abs = require('./abs');

    if(!(this instanceof concrete)){

       return new concrete(val);

    }

    concrete.prototype = Object.create(abs.prototype);

 }

そして書くと…

 var anObject { name : "John" };
 var concreteObject = new concrete(anObject);
 concrete.getName();

次のエラーが表示されます..

TypeError: Object #<conrete> has no method 'getName'

私は何を間違っていますか?

4

1 に答える 1

1

あなたが書いたものには2つのエラーがあります(行方不明のものはそのまま=にしておきます):

  • concrete.getName()concreteコンストラクター関数であるため、機能しません。そのような方法はありません。
  • concreteObject.getName()そのプロトタイプにはそのようなメソッドがないため、機能しません。concrete.prototype コンストラクターで上書きしましたが、インスタンスは古いもので既に構築されています。オペレーターの仕組みをnew確認してください。

したがって、これらのクラス定義も修正する必要があります。これまで見てきたように、共有プロトタイプ関数からコンストラクター引数にアクセスすることはできません。これは意味がありません。また、コンストラクターでプロトタイプ メソッドを割り当てると、すべてのインスタンスvalで最新のabs呼び出しを利用できるようになります。うーん。

プロトタイプを使用します。

function abs(val) {
    if (!(this instanceof abs))
        return new abs(val);

    this.val = val;
}
abs.prototype.getName = function getName(){
    return this.val.name;
};
module.exports = abs;

または、特権インスタンス メソッドを使用します (説明については、Javascript: Do I need to put this.var for every variable in an object?を参照してください)。

function abs(val){
    if (!(this instanceof abs))
        return new abs(val);

    this.getName = function getName(){
       return val.name;
    };
}
module.exports = abs;

それについてはconcrete、なぜあなたがそれを必要としているのかまったく理解できませconcrete = abs;ん。ただし、継承の青写真は次のようになります。

var abs = require('./abs');
function concrete(val){
    if (!(this instanceof concrete))
        return new concrete(val);

    abs.call(this, val);
}
concrete.prototype = Object.create(abs.prototype);
于 2013-09-19T23:52:27.610 に答える