1

理解できない:

function Rabbit() { }
Rabbit.prototype = { eats: true };
var rabbit = new Rabbit();
Rabbit.prototype = {};
alert(rabbit.eats); //true

function Rabbit() { }
Rabbit.prototype = { eats: true };
var rabbit = new Rabbit();
Rabbit.prototype.eats = false;
alert(rabbit.eats); // false

なんで?
「最初の例では、Rabbit.prototype を変更して、まったく新しい別のオブジェクトを指すようにしました。そのため、Rabbit.prototype と rabbit.[[Proto]] は同じものを指しなくなりました。 (c) TJクラウダー

4

3 に答える 3

2

インスタンスの背後にあるプロトタイプは、を介して作成されたときにrabbit(から) 割り当てられるため、最初の例では、インスタンスに影響を与えない完全に新しいオブジェクトに置き換えます。2 番目の例では、両方と背後のプロトタイプが指している既存のオブジェクトを変更するだけです。したがって、それらは同じオブジェクトを指しているため、どの参照に従うかに関係なく変更が表示されます。Rabbit.prototypenew Rabbit Rabbit.prototyperabbitRabbit.prototyperabbit

順を追って説明しましょうvar rabbit = new Rabbit();(関係のない詳細は省きます):

  1. 新しい空のオブジェクトが作成されます。

  2. その基礎となるプロトタイプ (通常は と呼ばれる[[Proto]]) は に設定されRabbit.prototypeます。(私が「通常呼ばれる」と言うのは、それが仕様で呼ばれているためです。その名前で直接アクセスすることはできません。ただし、ES5 対応環境では、Object.getPrototypeOf.エンジンはまた、実際には [in code] と呼ばれる非標準のプロパティを介して利用できるようにします__proto__。)

  3. その新しいオブジェクトが返され、 に割り当てられrabbitます。

これで、プロトタイプ オブジェクトを指す 2 つのオブジェクトRabbit.prototype、 、および ができrabbit.[[Proto]]ました。

最初の例ではRabbit.prototype、まったく新しい別のオブジェクトを指すように変更します。そのため、同じオブジェクトを指すことはなくなりましたRabbit.prototyperabbit.[[Proto]]

2 番目の例では、その共有オブジェクトのeatsプロパティの値を変更するだけなので、その変更は、従うオブジェクトへの参照に関係なく表示されます。

基本的にはこれと同じです:

var a = {eats: true};
var b = a;
a = {eats: false};
console.log(a.eats); // false
console.log(b.eats); // true

var a = {eats: true};
var b = a;
a.eats = false;
console.log(a.eats); // false
console.log(b.eats); // false
于 2013-03-11T15:04:24.227 に答える
1
Rabbit.prototype = { eats: true };

と同等です

Rabbit.prototype = {};
Rabbit.prototype.eats = true;

Rabbit.prototype.eats = false;

作るだけですRabbit.prototype.eats false(したがって、先の代入を無効にします)。

また、js エンジンは、プロパティを探すときに、そのプロトタイプ (など) の 1 つを探しますが、ローカルで見つからない場合は、Rabbit.eatsfalse に評価されます。

于 2013-03-11T15:05:40.420 に答える
0

最初のケースでは、構築されたオブジェクトは元のプロトタイプ オブジェクトにリンクされたままになります。もちろん、これにはまだ「eats」プロパティがあります。

2 番目のケースでは、新しいプロトタイプを導入していないため、「eats」プロパティの値の変更はインスタンスを介して表示されます。

于 2013-03-11T15:04:14.727 に答える