2014-01-24 27 views
0

據我所知,eval()可能是有害的。看到我的JSLint中的所有警告令人討厭。如何避免使用eval()作爲基礎對象

我的許多功能與我的願望清單/購物車相同。所以我想讓它變成動態的,只有每個功能都有。

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

cartWish.addItem()內部,我需要訪問cart.datawish.data,具體取決於類型參數。

我該如何做到這一點,而不訴諸於eval(type).data

我試過this[type].data,它似乎沒有正常工作。

+2

'addItem(target)'其中'target'可以是'cart'或'wish'嗎? – georg

+1

爲什麼不簡單。 'if(type ==='wish'){wish.data; } else if(type ==='cart'){cart.data; }':-) –

+2

@ thg435:你的意思是傳入'cart'或'wish'對象而不是字符串? –

回答

0

這是編程差我的一部分。我不知道JavaScript傾向於引用對象而不是副本。

這樣算下來...

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

...居然會改變cart.data [0]的功能。名稱之外。而且它不會在內存中製作購物車對象的副本。

注意:您也可以通過引用將對象傳入函數,但我不確定是否可以,因爲我有時從KnockoutJS單擊事件調用此函數。

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(...) 
+0

我一直希望避免製作一個對象副本(它們很大),但這可能是最好的解決方案;因爲一旦函數完成執行,對象就會被銷燬。 – Glyph

+0

我只是讀了一個地方,傳遞一個對象到一個函數自動通過引用傳遞它。真的嗎?如果是這樣,我只需傳入對象而不是字符串中的「cart」或「wish」。 – Glyph

相關問題