如何避免对基础对象使用eval()

时间:2014-01-24 21:39:19

标签: javascript eval

据我了解,eval()可能有害。看到我的JSLint中的所有警告很烦人。

我的愿望清单/购物车中有许多相同的功能。所以我想让它变得动态,每个只有一个功能。

而不是cart.addItem()wish.addItem(),我想要cartWish.addItem(type)

cartWish.addItem()内部我需要访问cart.datawish.data,具体取决于类型参数。

如何在不诉诸eval(type).data的情况下执行此操作?

我尝试了this[type].data,但似乎无法正常工作。

2 个答案:

答案 0 :(得分:1)

之间有什么区别
cart.addItem(...);
wish.addItem(...)

cartWish.addItem("cart", ...);
cartWish.addItem("wish", ...);

看起来像是相同数量的代码行,然后你所做的就是模糊你正在做的事情。也许创建一个带有购物车或愿望对象并假设它们具有相同界面的函数:

function addItem(x, data) {
    x.addItem(data);
}

var cart = ...
var wish = ...

addItem(cart, {...});
addItem(wish, {...});

另一种选择是创建一个类:

function Item(type) {
    this.type = type;
}

Item.prototype.add = function add(...) {
    // ...
};


var cart = new Item("cart");
var wish = new Item("wish");

cart.add(...)
wish.add(...)

答案 1 :(得分:0)

我的编程很糟糕。我不知道JavaScript倾向于引用对象而不是副本。

这样做......

var myReference=(type == "cart") ? cart.data : wish.data;
myReference[0].name="Bob Dole's Grill";

...实际上会在函数外部更改cart.data [0] .name。而且它不会在内存中制作购物车对象的副本。

注意:您也可以通过引用将对象传入函数,但我不确定是否可以,因为我有时会从KnockoutJS点击事件中调用此函数。