2

私はプロトタイプ継承の概念に比較的慣れていないので、これはプロトタイプ継承がどのように機能するか、またはこれは単なるjavascriptですが、プロトタイプ継承は適切なプリミティブ型のみのようです。たとえば、次のコードがあります。

var leg = {
    type: null
};

var Animal = {
  traits: {},
  leg: Object.create(leg)
};

var lion = Object.create(Animal);
lion.traits.legs = 4;
lion.leg.type = 'left';

var bird = Object.create(Animal);
bird.traits.legs = 2;
bird.leg.type = 'right';

alert(lion.traits.legs) // shows 2???
alert(lion.leg.type) // shows right???

最後の 2 行は、私の混乱を示しています。これは本当にプロトタイプの継承がどのように機能するはずなのか、それとも JavaScript がそれをどのように実装したのか?

これが実際にプロトタイプの継承が機能する方法である場合、ほとんどの場合、そのタイプの継承がどのように役立つかはわかりません。プリミティブ型しか持てない場合、別のオブジェクトのインスタンスを格納するオブジェクトがある場合が多いため、複雑なオブジェクトの作成が非常に制限されているようです。

4

2 に答える 2

2

非プリミティブ状態を継承しないでください。メソッドを継承します。各オブジェクトに独自の状態を持たせます。状態はオブジェクトを一意にするものです。すべてのオブジェクトが同じ状態を共有している場合、意味がありません。

var Animal = {
    method1: function() {},
    method2: function() {}
};

var lion = Object.create(Animal, {
    traits: {
        value: {}
    },
    leg: {
        value: {
            type: null
        }
    }
});

var bird = Object.create(Animal, {
    traits: {
        value: {}
    },
    leg: {
        value: {
            type: null
        }
    }
});

ところで、ほとんど同じことを行うための、はるかに冗長ではなく、より適切にサポートされている構文があります。

function Animal(traits, leg) {
    this.traits = traits;
    this.leg = leg;
}

var method = Animal.prototype;

method.method1 = function() {

};

method.method2 = function() {

};


var lion = new Animal({}, {type: null}),
    bird = new Animal({}, {type: null});
于 2012-08-24T11:04:06.437 に答える
0

はい、これが本来の動作です。プロパティtraitslegは、インスタンス間で共有される変更可能なオブジェクトです。プロトタイプ継承の考え方は、明示的にオーバーライドしない限り、プロトタイプからすべての状態を継承するというものです。traitフィールドとフィールドをオーバーライドしないlegため、プロトタイプと共有されます。

これは、状態が継承されないクラスベースの継承とは異なります。コンストラクターですべての状態を初期化する必要があります。

複雑なオブジェクトを持つことができますが、各インスタンスがオブジェクト フィールドの独自の新しいインスタンスを持つ必要がある場合は、コンストラクターの場合と同様に、インスタンスの作成後にそれらを作成する必要があります。

プロトタイプの継承は、(クラスベースの継承と比較して) 次の理由で便利です。

  1. プロトタイプとは異なるフィールドに「スロット」を割り当てるだけなので、多くのメモリを節約できます。クラスベースのオブジェクトでは、すべてのフィールドがデフォルト値から変更されない場合でも、常にすべてのフィールドにスペースを割り当てる必要があります。

  2. 変更を継承するのは簡単です。たとえば、UI フレームワークに「ウィンドウ」プロトタイプがあり、このプロトタイプから継承する多くの具体的なウィンドウがある場合、プロトタイプの色を変更すると、明示的にオーバーライドされていないすべてのインスタンスに自動的に継承されます。

于 2012-08-24T11:04:48.760 に答える