4

Stoyan Stefanov によるJavaScript パターンの本で次のコードを見ました(余分な脂肪を削除するように編集されています)。

function Universe() {
    var instance = this;
    Universe = function() {
        return instance;
    }
}

Universe.prototype.nothing = true;
var uni = new Universe();
Universe.prototype.everything = true;
var uni2 = new Universe();

uni.nothing;     // true
uni2.nothing;    // true, but I was expecting undefined
uni.everything;  // undefined
uni2.everything; // undefined, but I was expecting true

nothing元の関数のプロトタイプにeverything割り当てられ、クロージャーのプロトタイプに割り当てられることを期待していました (2 番目の割り当ては再定義後に発生するため)。ただし、出力は何か奇妙なことが起こっていることを示しており、本では実際には説明されていません。また、次のことに気付きました。

  1. Universe.prototype私が予想したように、関数が再定義された後、別のオブジェクトを指します。
  2. 再定義後に作成された追加のインスタンスは、元のプロトタイプ オブジェクトを として引き続き取得します__proto__。それは私が理解していないものです。

誰か説明してくれませんか?

4

2 に答える 2

5

シングルトンパターンです。初めてユニバースを作成すると、ユニバース シンボルが再定義されます。(しかし、それはまだある種の漠然とした状態で存在します: インスタンスはそれへの何らかの参照を持ってい__proto__ます。例えば、非厳密モードでは.)

新しいユニバース シンボル実際にはコンストラクターではなく、最初に作成されたインスタンスを返すだけです。2 番目の呼び出しの new キーワードは、2 番目のユニバースをプロトタイプとして新しいインスタンスを作成しますが、新しい関数はそれを無視し、代わりに格納された最初のインスタンスを返します。

于 2013-01-04T14:14:10.693 に答える
3

uni関数の両方のバージョンで の値が返されるため、とuni2は同じオブジェクトです。instanceUniverse

これは同じコードですがinstance、再定義されたものから返されていませんUniverse: http://jsfiddle.net/nmaBn/

于 2013-01-04T14:14:59.263 に答える