0

連想配列として動作するJavascriptオブジェクトを作成する必要がありますが、プロパティを取得および設定する前に呼び出される関数がいくつかあります。

たとえば、タスクは次のようになります。次のように、キーの 2 乗値を含むオブジェクトを作成する必要があります。

obj.two should be equal to 4, 
obj.four should be equal to 16, 
obj['twenty one'] should be equal to 441.

これは一例です。実際には、設定操作もオーバーライドする必要があります。取得操作と設定操作はデータベースに送られ、必ずしも文字列をキーとして使用するのではなく、DB クエリを作成する任意のタイプのオブジェクトを使用します。

a) サードパーティのライブラリをできるだけ少なくし、b) できるだけ多くのプラットフォームで動作させるにはどうすればよいですか?

私は JS を初めて使用します。JS には連想配列がなく、任意のプロパティを使用してオンザフライでオブジェクトを定義する機能に依存していることがわかりました。私はググって、その場で新しいゲッター/セッターを定義するルックアップゲッター(およびセッター)を使用またはオーバーライドするというアイデアを持っていましたが、インタープリターが新しいキーに遭遇するたびにこのメソッドを使用するかどうかわかりませんでした。とにかく、文字列や数字以外はキーとして使用できないようです。

Java では、java.util.Map を実装するだけです。

Javascriptで同じことをするにはどうすればよいですか?

編集

[[Get]]ここで言及されているオーバーライドと[[Put]]メソッドを管理すれば、必要なものが得られると思いますhttp://interglacial.com/javascript_spec/a-8.html#a-8.6.2.1

4

3 に答える 3

2

http://ejohn.org/blog/javascript-getters-and-setters/を参照してください。

また、この特定の回答:Javascriptのゲッターとセッターはダミーですか?

編集

Does JavaScript has the Equivalent of Python's __getattribute__? によると プロパティの__noSuchMethod__ 機能に相当するもの、または JS で実装する方法はありますか? OPが望んでいることを正確に達成する良い方法はありません。ゲッターとセッターは、探しているものの名​​前を事前に知っている必要があるため、役に立ちません。

したがって、私の推奨事項は次のようなことです。

var database = {}
database.cache = {}
database.get = function(key) {
    // INSERT CUSTOM LOGIC to recognize "forty-two"
    if (!(key in database.data))
        database.cache[key] = fetch_data_from_database();
    return database.cache[key];
}
database.put = function(key, value) {
    database.cache[key] = value;
    send_data_to_database(key, value);
}
于 2011-06-17T07:11:13.783 に答える
1

あなたの例では、これはあなたが望むことをしませんか:

var myObj = {};

myObj["two"] = 4;
myObj["four"] = 16;
myObj["twenty one"] = 441;

alert(myObj["four"]); // says 16

それとも、オブジェクトが魔法のように二乗を計算するべきだと言いたいのですか?

JavaScript オブジェクト キーは文字列です。数値をキーとして使用しようとすると、JavaScript は基本的に最初に文字列に変換します。

そうは言っても、オブジェクトに意味のあるメソッドを定義すれば、オブジェクトをキーとして使用できます。しかし、もちろん意味のあることはケースバイケースで起こることであり、あなたのケースのために何をする必要があるかはあなただけが知っています.toString

オブジェクトメソッドを介してアクセスする独自の内部データ構造を維持するオブジェクトを定義することもできます。それを説明することは、この投稿の範囲を超えていると思います。開始するためのいくつかのポインターについては、Google の「javascript モジュール パターン」を参照してください。

于 2011-06-17T07:24:52.177 に答える