我想让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中的字段,如果它不存在,请在另一个对象(单元格注册表)中查找?
答案 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。