9

私はJavaScriptのプロトタイピングと継承の可能性について頭を悩ませようとしていますが、確かに何かが欠けています。単純なコンストラクター (関数 Counter()) から始めましょう。単純なプロパティとオブジェクトのインスタンス化を追加します。

function Counter() { this.a = "first"; };
Counter.prototype.b = "second";
var counter = new Counter();

この時点で、counter.a「first」をcounter.b返し、「second」を返します。counter.cもちろんundefined、どちらも理解できます。コンストラクターのプロトタイプに別のプロパティを追加しましょう。

Counter.prototype.c = "third";  

現在、counter.c「3 番目」が返されます。しかし...気が変わったので、これらのプロパティを取り除きましょう。

Counter.prototype = {};

簡単なロジックを使用して、counterプロトタイプのprototypeプロパティを上書きすると、counter以前に Counter.prototype に追加したプロパティが失われます。しかし、そうではありませんcounter.c。「3 番目」を返します。私はここで迷っています。それでは...値を上書きしてみましょう:

Counter.prototype.c = "fourth hohoho";

何も変わらず、counter.c は引き続き「second」を返します。

プロパティの削除に失敗したのはなぜですか? 私は何が欠けていますか?

4

3 に答える 3

11

オブジェクトを作成すると、そのプロトタイプ オブジェクトへの参照がプロトタイプに追加されます。

そのプロトタイプ オブジェクトを拡張できます。インスタンスは参照を共有するため、これらの変更は既存のインスタンスに反映されます。

ただし、プロトタイプ オブジェクトを上書きすると、以前に作成されたインスタンスは元のプロトタイプ オブジェクトへの参照を保持したままになります。

これは、次のコードで起こることと同じです:

var a = {};
var b = a;

a.foo = 'bar';    // augment 'a'
b.foo === 'bar';  // true

a = {};           // overwrite 'a'
b.foo === 'bar';  // still true
于 2013-05-22T15:00:48.477 に答える
8

プロトタイプ オブジェクトからプロパティを動的に追加/削除できますが、既に作成されているインスタンスのプロトタイプ オブジェクトを置き換えることはできません。あなたの例では、コンストラクターのプロトタイプ プロパティを置き換えた後に作成されたインスタンスは新しいプロトタイプを取得しますが、その前に作成されたインスタンスは以前のオブジェクトへの参照を保持します。

プロトタイプからいくつかのプロパティをクリアしたい場合は、delete演算子を使用して元のオブジェクトからそれらを削除します。

delete Counter.prototype.c;
于 2013-05-22T14:58:35.247 に答える
0

あなたはこれについて確信を持っていますか?試す:

function fa () {this.a=1}
var fb = new fa ();
fa.a = 2;
fa.prototype.a = 3;
var fc = new fa ();
console.log (fa.a, fb.a, fc.a);
あなたの言うことから、2 1 3を出力する必要がありますが、2 1 1を出力します

于 2015-01-09T18:20:22.073 に答える