0

まだJS初心者のようですが、プロトタイプと継承を使用するための最良の/最もクリーンな方法を理解しようとしています。

通常、私は次のようなオブジェクト/プロトタイプ定義を記述します。

var Foo = function(data) {
  this.data = data;
};
Foo.prototype = {
  someMethod: function() {
    return "whatever";
  }
};

数層の深さの名前空間オブジェクトを使用することが多いので、これが好きです。実際には、次のようになります。

App.Model.FooModel = function(){...};
App.Model.FooModel.prototype = {...};

プロトタイプを作成するためにすべてのメソッドのフルネームを入力する必要がないので、これは素晴らしいことです。つまり、名前だけです。someMethod: function(){}の代わりにApp.Model.FooModel.prototype.someMethod = function(){}

さて、私が遭遇した問題は、JSの継承でこれを行う方法がわからないことです。このようにすると、継承が正常に機能するようになります。

var Child = function(){...};
Child.prototype = new Parent;
Child.prototype.someMethod = function(){...};

...しかし、より複雑なアプリケーションでは、すべてのメソッドのオブジェクトのフルネームを書き出すことに戻ります。これは、面倒で読みにくいと思います。

だから、私の質問は、オブジェクトのフルネームを使用してすべての子メソッドをアタッチすることを除いて、別のオブジェクトから継承するプロトタイプを作成するためのクリーンで簡単な方法はありますか?

ありがとう!

4

1 に答える 1

4

さて、これはjavascriptなので、いつでも自分で書くことができます。

function construct ( parent, fn, attr ) {
    fn.prototype = new parent();

    for (var x in attr) {
        fn.prototype[x] = attr[x];
    }
    return fn;
}

必要に応じてhasOwnPropertyチェックを実行できますが、わかりやすくするために上記は最も単純な実装です。この関数は、3つのステップを1つにカプセル化します。これで、次のことが簡単にできます。

var Foo = construct(
    Parent,
    function(data) {
        this.data = data;
    },
    {
        someMethod: function() {
            return "whatever";
        }
    }
);

構文が気に入らない場合は、いつでもより良い構文を思い付くことができます。別の実装は、attr拡張部分を単純に実装し、継承を通常どおりに実行することです。

function extend (obj, attr) {
    for (var x in attr) {
        obj.prototype[x] = attr[x];
    }
    return obj;
}

繰り返しますが、わかりやすくするために簡略化しています。したがって、構文は次のようになります。

var Foo = function(){...};
Foo.prototype = new Parent;
extend(Foo.prototype,{
    someMethod : function(){...}
});
于 2013-03-20T02:37:48.227 に答える