3

私の質問は次のとおりです。私がクロージャについて読んだほとんどまたはすべてのチュートリアルでは、クロージャの最も重要な資産は、プライベート メンバーを定義できると説明されています。たとえば、素晴らしい nettuts の Web サイトから: http://net.tutsplus.com/tutorials/javascript-ajax/digging-into-design-patterns-in-javascript/ . 私の質問は次のとおりです。Object.definteProperty を使用できるのに、なぜクロージャーを使用して、やや不自然な構文でオブジェクトを作成することを選択するのですか? 例えば

var o = {}; // Creates a new object

 // Example of an object property added with defineProperty with a data property descriptor
Object.defineProperty(o, "a", {value : 37,
                           writable : false,
                           enumerable : true,
                           configurable : true});
 // 'a' property exists in the o object and its value is 37

どちらの方法も従来の OOP 言語よりもはるかに長いことは認めざるを得ませんが、2 番目の方法の方が自然ではありませんか? では、なぜクロージャーはそれほど人気が​​あるのでしょうか?クロージャーには他にどのような資産があり、クロージャーを使用してオブジェクトを作成することと、先ほど説明した方法でオブジェクトを作成することの違いは何ですか?

4

2 に答える 2

1

Object.definePropertyクロージャーはプライバシーを許可しますが、パブリックプロパティを定義します (プライベートな「メンバー」について話すべきではありません。それは単なるローカル変数です)。

あなたの例でdefinePropertyは、列挙可能、書き込み可能、​​および構成可能なデータプロパティを定義するために使用することは、デフォルトのプロパティ割り当てによって省略できます(そしてそうすべきです)(これは古いブラウザでも機能します):

o.a = 37;

すべてのオブジェクトをクロージャーで作成する必要があるわけではありません (あなたの例では、どのアプリケーションも考えられません) .

于 2013-02-17T14:53:33.850 に答える
0

これは、構文の好みとブラウザーの互換性の問題です。ブラウザと互換性のあるコードが必要な場合、definePropertyメソッドは IE 9+ で非 dom オブジェクトに対してのみ使用できます。

構文に関する限り、 を使用すると、私が「視覚的なカプセル化」と呼んでいるものを少し失うことがわかりますdefineProperty

どちらの方法にも独自の利点がありますが、どちらもプライバシーをより直接的にサポートする言語の単純さに欠けています。

ノート:

  • 私は、あなたが書き込み可能なプロパティをfalseに設定していることを意味すると仮定しています。

参照

于 2013-02-17T14:53:24.967 に答える