在Javascript中更改[“foo”]的含义?

时间:2013-11-29 19:09:49

标签: javascript

我想让foo [“bar”]正常返回bar字段值,但如果它不存在,请在另一个对象中查找它以在那里找到它。是否有可能取代[]的工作方式?

为什么呢?我正在将一个6岁的Javascript应用程序移植到AngularJS。在现有的应用程序中,(当然)有一个全局变量(我们称之为i2),它被用作一个名称空间,它附加了应用程序中的所有内容。

i2.models.fooModel.bar += 1; //and the rest of the app is similar

如果这还不够,i2也被用作应用程序“单元格”的注册表,如下所示:

var myCell = i2["MyCell"]; 

我将全球的字段分解为AngularJS服务。单元查找功能也分为另一个服务器“单元注册表”服务。由于此应用程序具有我们希望向后兼容的现有插件,我希望现有插件中的代码如下:

var myCell = i2["MyCell"]; 

......仍在工作(虽然已弃用)。有没有办法可以替换i2中的[]函数来查找i2中的字段,如果它不存在,请在另一个对象(单元格注册表)中查找?

2 个答案:

答案 0 :(得分:3)

不,你不能直接并从字面上改变

的含义
i2["MyCell"]

因为这是语言的设计,而且通常无法更改(如果可以的话,这会很糟糕)。但是,您可以这样做:

function lookupVar(key) {
    var value = i2[key];
    if(typeof value !== "undefined") {
        return value;
    }

    // do whatever you want to do now that it couldn't be found
}

var myCell = lookupVar("MyCell");

当然,这可以扩展到处理除了单个变量i2之外的其他事情。它可能根本不需要和简单的

var myCell = typeof i2["MyCell"] !== "undefined" ? i2["MyCell"] : somethingElse["MyCell"];

可能就足够了(虽然它包含烦人的重复)。如果您知道i2["MyCell"]中存在关键字,那么它不会是假值(0""false,...),那么这就足够了< / p>

var myCell = i2["MyCell"] || somethingElse["myCell"];

虽然不太适合未来。

答案 1 :(得分:1)

是的,您可以使用getters(在IE8中不起作用)或Proxy(不建议用于生产代码)......

  

有没有办法可以替换i2中的[]函数来查找i2中的字段,如果它不存在,请在另一个对象(单元格注册表)中查找?

或者只考虑prototypes