我有一个函数可以帮助我创建临时对象,节省打字时间。
附加编辑:为了澄清,这个函数只会存在于匿名函数中。
(function(){ // clarification of the functions location
var objectPump = function (props, defaults){
var str;
if(typeof defaults === "string"){
defaults = defaults.split(",");
}else
if(typeof defaults === "undefined" || !defaults.isArray){
defaults =[];
}
if(props !== undefined){
if(typeof props === "string"){
props = props.split(",");
}
}else{
throw new TypeError("No properties defined for objectPump.");
}
// create function body
str = "var obj={};";
props.each( function(p,i) {
str += "obj." + p + "=";
if (typeof defaults[i] === "string") {
str += p + "===undefined?" + '"' + defaults[i] + '":';
} else
if (typeof defaults[i] === "number") {
str += p + "===undefined?" + defaults[i] + ":";
}
str += p + ";";
});
str += "return obj;";
str = "return new Function('" + props.join("','") + "','" + str + "')";
// Uses new Function to create the new function
return (new Function(str))(); // Is this dangerous???
}
})(); // wrapped in an anon function
这使我可以创建对象,而不必在默认值中命名所有属性和代码。
编辑:使用上述函数。
var car = objectPump("colour,year,type", // objects property names
"white,2015,All Wheel Drive"); // object defaults
// or as arrays
var car = objectPump(["colour","year","type"], // objects property names
["white",2015,"All Wheel Drive"]); // object defaults
var cars = [
car("red",2011), // missing property defaults to All Wheel Drive
car("blue",2015,"bike"),
];
var aCar = car("blue",2015,"bike");
// same as
var aCar = {
colour:"blue",
year:2015,
type:"bike"
}; // but saves me having to type out the property names for each new object
对我来说,这看起来很像使用eval并且第三方黑客可以注入一些恶意代码。到目前为止,它非常方便,我很想在其他任务中使用new Function
。
我应该使用new Function()
来生成代码吗?对于公共代码来说,它是否被认为是不好的和/或危险的?
new Function
可能并不是必要的。(而且这也是一个不好的实践,但目前看起来似乎没有任何漏洞...但如果没有上下文很难说。) - Ry-new Function
。 - JJJ