web-dev-qa-db-ja.com

プロトタイプ継承-書き上げ

そのため、javascript.infoから次の2つの例があります。

例1:

var animal = {
  eat: function() {
    alert( "I'm full" )
    this.full = true
  }
}

var rabbit = {
  jump: function() { /* something */ }
}

rabbit.__proto__ = animal 

rabbit.eat() 

例2:

function Hamster() {  }
Hamster.prototype = {
  food: [],
  found: function(something) {
    this.food.Push(something)
  }
}

// Create two speedy and lazy hamsters, then feed the first one
speedy = new Hamster()
lazy = new Hamster()

speedy.found("Apple")
speedy.found("orange")

alert(speedy.food.length) // 2
alert(lazy.food.length) // 2 (!??)

例2から開始します。コードがspeedy.foundに達すると、foundspeedyプロパティが見つからないため、プロトタイプに登って変更します。 food.lengthが両方のハムスターで等しい、つまり同じ胃を持っている理由です。

これから、存在しない新しいプロパティを作成して追加すると、インタープリターはプロパティが見つかるまでプロトタイプチェーンを上に移動し、そのプロパティを変更することを理解しています。

しかし、例1では何か他のことが起こります。
_rabbit.eatを変更するrabbit.fullを実行します。 fullプロパティはどこにも見つからないので、プロトタイプチェーンを上に移動して(オブジェクトに??)、ここで何が起こるかわかりません。この例では、fullのプロパティrabbitが作成および変更されますが、最初の例では、プロパティが見つからないためプロトタイプチェーンを上っていきます。

私は混乱しており、なぜこれが起こるのかわかりません。

129
frrlod

プロトタイプは[〜#〜] not [〜#〜]オブジェクトの各インスタンスに対してインスタンス化されます。

Hamster.prototype.food = []

ハムスターのすべてのインスタンスがその配列を共有します

ハムスターごとにフードコレクションの個別のインスタンスが必要な場合(この場合は必要です)、インスタンスにプロパティを作成する必要があります。例えば:

function Hamster() {
  this.food = [];
}

例1についての質問に答えるために、プロトタイプチェーンのどこにもプロパティが見つからない場合、ターゲットオブジェクトにプロパティを作成します。

15
BLSully