そのため、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
に達すると、found
にspeedy
プロパティが見つからないため、プロトタイプに登って変更します。 food.length
が両方のハムスターで等しい、つまり同じ胃を持っている理由です。
これから、存在しない新しいプロパティを作成して追加すると、インタープリターはプロパティが見つかるまでプロトタイプチェーンを上に移動し、そのプロパティを変更することを理解しています。
しかし、例1では何か他のことが起こります。
_rabbit.eat
を変更するrabbit.full
を実行します。 full
プロパティはどこにも見つからないので、プロトタイプチェーンを上に移動して(オブジェクトに??)、ここで何が起こるかわかりません。この例では、full
のプロパティrabbit
が作成および変更されますが、最初の例では、プロパティが見つからないためプロトタイプチェーンを上っていきます。
私は混乱しており、なぜこれが起こるのかわかりません。
プロトタイプは[〜#〜] not [〜#〜]オブジェクトの各インスタンスに対してインスタンス化されます。
Hamster.prototype.food = []
ハムスターのすべてのインスタンスがその配列を共有します
ハムスターごとにフードコレクションの個別のインスタンスが必要な場合(この場合は必要です)、インスタンスにプロパティを作成する必要があります。例えば:
function Hamster() {
this.food = [];
}
例1についての質問に答えるために、プロトタイプチェーンのどこにもプロパティが見つからない場合、ターゲットオブジェクトにプロパティを作成します。