2017-06-10 4 views
3

は、私がコメント「は、同じオブジェクトをリサイクルする」と言って、次のコードスニペットを見つけました:このコードスニペットで「リサイクル」とはどういう意味ですか? MDNで

// recycling same object 
function withValue(value) { 
    var d = withValue.d || (
    withValue.d = { 
     enumerable: false, 
     writable: false, 
     configurable: false, 
     value: null 
    } 
); 
    d.value = value; 
    return d; 
} 

誰かが平易な言葉を使用することができ、コードのこの作品は本当に何に少し説明?初心者にとってはそれほど明白ではありません。ありがとう。

とソースURL: enter link description hereまた

、代わりのように、なぜwithValueのプロトタイプにそれを入れていない、withValue機能自体にdを置く:

var d = withValue.prototype.d || (... 

ここでの主な考慮事項は何ですか?

+0

'var' = {}'のようなものではなく 'Function'オブジェクト(' withValue')を使ってオブジェクトを操作するだけです。しかし、私はObject.defineProperty()でどのように収まるのかはよく分かりません。 –

+0

私はこの関数がObject.definePropertyに渡されるいくつかのプロパティを生成するために使われると思います。'withValue'関数に' d'プロパティを代入すると、返された値は代りに割り当てられた値に基づいています。 –

+4

これは、通常の英語の意味で「リサイクル」を使用しています。これは、毎回新しいオブジェクトを作成するのではなく、以前の呼び出しで使用されたものと同じオブジェクトを再利用しています。 –

答えて

0

あなたが関数を呼び出し初めてで書き込み可能ではない列挙ではないnewPropの名前プロパティは、それは新しい変数「d」を作成しますobj割り当てます。それをそれ自身に割り当てる。 OOPでは、関数withValueは同じクラスになり、dは静的メンバーのようになります。

console.log(withValue.d); //undefined 
var x = withValue(5); 
console.log(x.value); //5 
console.log(withValue.d.value); //5 
console.log(x === withValue.d); //true 

可変x可変withValue.dが同じオブジェクトに両方の参照である:

withValue.d.value = 1; 
console.log(x.value); //1 

Iが再びwithValueを起動した場合、それは既存の静的メンバ(withValue.dをリサイクルまたは再利用することになります

var y = withValue(8); 
console.log(withValue.d.value, y.value, x.value); //8 8 8 
console.log(x === y, x === withValue.d, y === withValue.d); //true true true 

アップデート::)とその値を更新withValueがあった場合:

function withValue(value) { 
    var d = { 
    enumerable: false, 
    writable: false, 
    configurable: false, 
    value: null 
    }; 
    withValue.d = d; 
    d.value = value; 
    return d; 
}; 

次に、関数の各呼び出しは、新しいオブジェクトを作成します。

var x = withValue(1); 
var y = withValue(2); 
console.log(withValue.d.value, y.value, x.value); //2 2 1 
console.log(x === y, x === withValue.d, y === withValue.d); //false false true 

y.value = 999; 
console.log(withValue.d.value, y.value, x.value); //999 999 1 

だから今、2つのオブジェクトが作成されます - xによってyによって参照される1つとwithValue.dおよびその他。最初のケースでは、これら3つの変数が同じオブジェクトにアクセスしていました。

+0

こんにちはindGov、私はあなたの推論に従うことを試みていますが、最後のセクションでまだ苦労しています:関数 'withValue'が各繰り返しで値を更新すれば、それは何をリサイクルしますか?あなたの例から、 '1'を' 8'に更新すると、リサイクルされているものはありません。私はいくつかの重要な点を欠いていますか?どうも。 –

+0

更新を確認してください...オブジェクトをリサイクルしないように関数を修正しました。 – indGov

+0

更新いただきありがとうございます。 MDNのWebページに示されているように、Object.defineproperty()のコンテキスト内でそのオブジェクトがどれほど有益であるか想像できますか?ここで「リサイクル」のポイントは何ですか? –

0

これは、Object.defineProperty()ツールの3番目の引数として使用されるプロパティ記述子オブジェクトを定義するヘルパ関数として与えられています。それに

は、それが書き込み可能ではない設定可能とwithValue関数に渡された値ではない、列挙ではない不変のプロパティを追加するObject.defineProperty()を強制withValue関数にデフォルトのプライベートプロパティを割り当てて最初の実行です。

したがって、次のコード。

var obj = {}; 
Object.defineProperty(obj, "newProp", withValue(10)); 
console.log(obj); // <- Object {newProp: 10} 

ない設定可能な値10

関連する問題