1

以下を組み合わせることは可能ですか?

function something() {}
function somethingElse() {}

somethingElse.prototype = new something();
somethingElse.prototype.someFunction = function() {}
...

これとともに

somethingElse.prototype = {
    someFunction: function() {},
    ...
}

プロトタイプ継承チェーンを維持します

それは純粋に化粧品だと思います。大量の...プロトタイプ...=...を使用するのではなく、{}内のすべての関数を定義したいと思います。

私はどちらかをかなりたくさん見ましたが、それらが一緒になったことは一度もありません。

4

4 に答える 4

1

これに対する私の個人的なお気に入りのアプローチは、underscore.jsライブラリを取得することです。プロパティをオブジェクトにタックするためのextendと呼ばれる非常に優れたメソッドがあります。だから、私はすることができます:

function something() {}
function somethingElse() {}

somethingElse.prototype = new something();

_.extend(somethingElse.prototype, {
    someFunction: function () { },
    someOtherFunction: function () { }
});
于 2013-02-15T21:03:06.457 に答える
0

違いは、2番目のバージョンでは、インスタンスはそのプロトタイプチェーンsomethingElseから何も継承しないことです。somethingただし、サンプルコードを考えると、違いはありません。

于 2013-02-15T21:02:04.070 に答える
0

まあ、彼らは確かにまったく同じです。

foo = {}
foo.bar = baz

と同じです

foo = {
    bar: baz
}

それは好みの問題です。

ところで:コンストラクター(newで呼び出されるもの)に大文字のイニシャルを付けて、通常の関数と区別する方が良いスタイルだと考えられています。これは、コンストラクターを混乱させると非常に悪いことが起こる可能性があるためです。

于 2013-02-15T21:03:00.450 に答える
0

を使用できますObject.definePropertiesが、実際にはより冗長であり、従来のブラウザではサポートされていません。

Object.defineProperties(somethingElse.prototype,{
    someOtherFunction: {
        value:function() {...}
    },
    ...
});

extendまたは、オブジェクトのプロトタイプに基本的なメソッドを追加することもできます。

Object.prototype.extend = function(obj){
    for(var p in obj)this[p] = obj[p];
};

これにより、これを行うことができます。

somethingElse.prototype.extend({
    A:function(){'a'},
    B:function(){'b'}
});

ネイティブオブジェクトのプロトタイプを変更すると危険が生じる可能性があるため、通常はこれに反対することをお勧めします。

于 2013-02-15T21:19:49.203 に答える