この方法で JavaScript を記述することの明白な利点は、外部のユーザーにアクセスさせたくないプロパティを非表示にできることです。直接。最終的なコードは次のようになります (クロージャを使用して、新しく作成された Field オブジェクトの値を保存します):
a.__defineSetter__(i, s);
a[i] = b [i];
}
}
私の extend() メソッドには、__lookupGetter__ と __lookupSetter__ という 2 つの新しいメソッドがあります。これは、実際にゲッターとセッターを使い始めると便利です。
たとえば、最初に extend() メソッドを書いたとき、さまざまなエラーが発生し、完全にめまいがしました。後で、問題は次の単純なステートメントにあることがわかりました。 a[i] = b[i];
オブジェクト a に i という名前のセッターがあり、オブジェクト b にも i という名前のゲッターがある場合、a[ i] は割り当てられません。他のセッター メソッドを介して、ただし b のゲッター メソッドから。これら 2 つの __lookup*__ メソッドを使用すると、元の関数を取得できます。 (この段落は少しわかりにくいので、原文は次のとおりです)
オブジェクト a に i という名前のセッターが存在し、オブジェクト b に i という名前のゲッターが存在する場合、a[i] の値は、他の setter 関数ではなく、b の getter 関数から計算された値に設定されていました。2 つの __lookup*__ メソッドを使用すると、メソッドに使用される元の関数にアクセスできるようになります (これにより、たとえば効果的な extend メソッドを作成できます)。 ).
次の点に注意してください:
オブジェクトでは、各変数は 1 つのゲッターまたはセッターのみを持つことができます。 (つまり、value には getter と setter を含めることができますが、value に 2 つの getter を含めることはできません)
getter または setter を削除する唯一の方法は、object[name] を削除することです。 delete では、一部の共通プロパティ、ゲッターおよびセッターを削除できます。
__defineGetter__ または __defineSetter__ を使用すると、以前に定義された同じ名前のゲッターまたはセッター (プロパティも含む) がオーバーライドされます。
プラットフォーム サポートされているブラウザは :
Firefox
Safari 3
Opera 9.5
(原文では Chrome について言及していませんでした。まだ (アウト)
次のコードを使用してブラウザをテストしました:
javascript:foo={get test(){ return "foo"; }};alert(foo.test);さらに、次の 2 つのエンジンもゲッターとセッターをサポートしています:
SpiderMonkey
Rhino 1.6R6 (新規)