我想將一個命名空間的內容轉儲到另一個javascript中。我能想出直接做到這一點的唯一方法是如下:使用eval在JavaScript中導入命名空間
var CHESSMEN = {
Chariot: function(color) {
return {
color: color,
abbreviation: 'R',
type: 'Chariot'
};
},
Horse: function(color) {
return {
color: color,
abbreviation: 'H',
type: 'Horse'
};
},
Elephant: function(color) {
return {
color: color,
abbreviation: 'E',
type: 'Elephant'
};
},
Advisor: function(color) {
return {
color: color,
abbreviation: 'A',
type: 'Advisor'
};
},
General: function(color) {
return {
color: color,
abbreviation: 'G',
type: 'General'
};
},
Cannon: function(color) {
return {
color: color,
abbreviation: 'C',
type: 'Cannon'
};
},
Soldier: function(color) {
return {
color: color,
abbreviation: 'S',
type: 'Soldier'
};
}
}
Object.freeze(CHESSMEN)
function Game(board) {
for (var piece in CHESSMEN) {
eval('var ' + piece + ' = CHESSMEN.' + piece);
}
if (typeof(board) === 'undefined') {
var board = {
a1: new Chariot('red'),
b1: new Horse('red'),
c1: new Elephant('red'),
d1: new Advisor('red'),
e1: new General('red'),
f1: new Advisor('red'),
g1: new Elephant('red'),
h1: new Horse('red'),
i1: new Chariot('red'),
b3: new Cannon('red'),
h3: new Cannon('red'),
a4: new Soldier('red'),
c4: new Soldier('red'),
e4: new Soldier('red'),
g4: new Soldier('red'),
i4: new Soldier('red'),
a10: new Chariot('black'),
b10: new Horse('black'),
c10: new Elephant('black'),
d10: new Advisor('black'),
e10: new General('black'),
f10: new Advisor('black'),
g10: new Elephant('black'),
h10: new Horse('black'),
i10: new Chariot('black'),
b8: new Cannon('black'),
h8: new Cannon('black'),
a7: new Soldier('black'),
c7: new Soldier('black'),
e7: new Soldier('black'),
g7: new Soldier('black'),
i7: new Soldier('black')
};
}
// et cetera
}
這裏我使用的是for in
循環遍歷凍結對象的按鍵,並使用eval
轉儲這些鍵及其關聯值進入Game
構造函數的範圍。很多人都告訴我不要使用eval
,但我沒有看到直接合並命名空間的另一種方法。這是不安全的嗎?作爲CHESSMEN
對象的屬性,將我稱爲棋子構造函數會更好嗎?
var board = {
a1: new CHESSMAN.Chariot('red'),
b1: new CHESSMAN.Horse('red'),
c1: new CHESSMAN.Elephant('red'),
//etc.
而且,你幾乎肯定不希望自己的Chariot
實現你擁有它,如果你打算使用new
方式:
爲什麼你需要*導入*他們?爲什麼不只是使用'CHESSMEN.Chariot'等? – zerkms
我想知道是否有任何_disadvantage_導入它們。但是爲了解決你的問題,我沒有理由在'CHESSMEN.Chariot'上使用'Chariot'。我只是好奇這個配方是否不安全。 – HandyAndyShortStack
是的 - 你正在做一些解決任務所不需要的東西。你的每一步都應該由一些要求引起。相反 - 當你做了一些奇怪的事情,並將它們證明爲「爲什麼不」時 - 並非如此。 – zerkms