0

我需要创建一个Javascript对象,它可以作为关联数组,但在获取和设置属性之前调用一些函数。

例如,任务可能是这样的:我们应该创建一个对象,它包含一个键的平方值,如下所示:

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

这是一个例子。实际上我也需要覆盖设置操作。获取和设置操作将转到数据库,它们不一定将字符串作为键,而是将任何类型的对象作为键,从中创建数据库查询。

我将如何做到这一点 a) 使用尽可能少的第三方库和 b) 使其在尽可能多的平台上工作?

我是 JS 新手,我发现 JS 没有关联数组,依赖于动态定义具有任意属性的对象的能力。我用谷歌搜索并有一个想法来使用甚至覆盖lookupgetter(和setter),在其中动态定义一个新的getter/setter,但我找不到解释器是否会在每次遇到新键时都使用这个方法。无论如何,看起来除了字符串或数字作为键之外,我无法使用任何东西。

在 Java 中,我只需实现 java.util.Map。

请帮助我,我将如何在 Javascript 中做同样的事情?

编辑

我想如果我设法覆盖这里提到的方法[[Get]]和方法,我会得到我想要的http://interglacial.com/javascript_spec/a-8.html#a-8.6.2.1[[Put]]

4

3 回答 3

2

http://ejohn.org/blog/javascript-getters-and-setters/

还有这个特别的答案:Javascript getters and setter for dummy?

编辑

根据Does JavaScript has the equivalent of Python's __getattribute__? 并且是否有与 __noSuchMethod__ 特性等效的属性,或者在 JS 中实现它的方法?没有什么好方法可以准确地完成 OP 想要的。getter 和 setter 没有用,因为您必须提前知道要查找的内容的名称。

因此,我的建议是执行以下操作:

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

您还可以定义维护自己的内部数据结构的对象,您可以通过对象方法访问这些数据结构。我认为解释这超出了这篇文章的范围。谷歌“javascript 模块模式”获取一些帮助您入门的指南。

于 2011-06-17T07:24:52.177 回答
1

我决定实现这一点的最正确方法是使用 Harmony:Proxies。它不适用于所有平台,但它可以以最无缝的方式实现它;未来可能会在更多平台上得到支持。

此页面包含一个示例,我将其用作模板来执行我想要的操作:

http://wiki.ecmascript.org/doku.php?id=harmony:proxies

于 2011-08-25T13:52:18.123 回答