19

私はノードのn00bでutil.inherits()あり、元のオブジェクトのプロトタイプ全体を置き換えるように見えるという事実を除いて、非常に便利です。例えば:

var myClass = function(name){
    this._name = name;  
};

myClass.prototype = {
    (...)
};

util.inherits(myClass, require('events').EventEmitter);

私の元のプロトタイプを消去するようです。

それは私に2つの不便をもたらします:
1-呼び出した後にプロトタイプにプロパティを追加することを宣言する必要がありますinherits

var myClass = function(name){
    this._name = name;  
};

util.inherits(myClass, require('events').EventEmitter);

myClass.prototype.prop1 = function(){...};
myClass.prototype.prop2 = function(){...};

そして、最も重要なのは、2つ以上の異なるクラスから継承できないと思います。

なぜこれが理にかなっているのか、そしてこれを回避するための良い方法は何でしょうか?

ありがとう

4

5 に答える 5

13

の後にプロトタイプを宣言する必要があるのは意味がありませutil.inherits()。私の推測はutil.inherits、当初意図されていた限られた内部ユースケースのみに合わせて調整された、内部使用のみの方法として生まれました。これは、ある時点で一般的な使用のために公開されました。モジュールは純粋な JS で記述されているため、プロトタイプを保持する独自のバージョンを実装するのutilは非常に簡単です。util.inherit元のutil.inheritソースは次のとおりです。

exports.inherits = function(ctor, superCtor) {
  ctor.super_ = superCtor;
  ctor.prototype = Object.create(superCtor.prototype, {
    constructor: {
      value: ctor,
      enumerable: false,
      writable: true,
      configurable: true
    }
  });
};

多重継承に関しては、Javascript のプロトタイプ継承は多重継承にはまったく適していないため、取り組むのがはるかに難しい問題になるでしょう。各インスタンスには内部[[Prototype]]プロパティが 1 つだけあり、実際のインスタンスで見つからないメンバーを検索するために使用されます。2 つの別個の「親クラス」のプロトタイプを 1 つのプロトタイプにマージできますが、その場合、親への継承が失われ、親プロトタイプを変更してすべての子に変更を表示させることができなくなります。

于 2012-11-20T14:04:32.653 に答える
9

関数定義の後、まず継承し、次にオブジェクトを実装する必要があります。また、クラスのコンストラクターでスーパークラス コンストラクターを呼び出すことも忘れないでください。

Function A(y){
  this.y = x;
}

Function B(x,y){
  this.x = x;
  A.call(this,y);
}

util.inherits(B,A);

B.prototype.mythodA = function() {
    //do something
}
于 2013-04-11T16:30:32.177 に答える
2

私は同じことを非常に望んでおり、拡張に不満を持っていたので、すでに便利なutil.inheritsメソッドにこの拡張機能を作成しました:

var util = require('util');

module.exports = {
    inherits : function(sub, sup, proto) {
        util.inherits(sub, sup);
        if (typeof proto !== 'undefined') {
            Object.keys(proto).forEach(function(key) {
                sub.prototype[key] = proto[key];
            });
        }
    }
};

これをプロジェクトに入れ、./util/index.jsこれを使用して次のようにします。

var EventEmitter = require('events').EventEmitter;
var util = require('./util');

function Foo() {
    EventEmitter.call(this);
}

util.inherits(Foo, EventEmitter, {
    bar : function(){
        console.log(this instanceof EventEmitter); // true
    }
});

ますます堅牢で有用であることがわかったら、これを公開するかもしれません。私は自分でかろうじて実装したので、テストを実行しています。

どう考えているか教えてください!

注: これ、いずれかのクラスのメソッドを、末尾の proto ハッシュで定義されたメソッドでオーバーライドします。それを知っておいてください。

于 2013-05-21T04:04:42.993 に答える