我正在编写一个类工厂,它是一个接受参数来定义类并返回一个javascript类(带有'this'上下文的函数)的函数,它是一个命名的函数,比如
function ClassName(){
// ...
}
除了函数的命名之外,它的工作都非常好。似乎没有办法动态创建命名函数。
我承认,这绝对是一个风格问题,并没有改变类的功能。我真的很喜欢在控制台中看到类名,以及所有祖先类的名称。它确实使调试变得更容易。
目前我正在使用eval()
来使用类似于。
function classGen(className, constructorFn, proto){
var NamedClass;
eval('NamedClass = function ' + className + '{ constructorFn.apply(this, arguments) };');
for(var key in proto)
NamedClass.prototype[key] = proto[key];
return NamedClass;
}
等...
这会被视为eval功能的“安全”使用吗?
为什么/为什么不呢?
--- ---编辑
我不知道为什么我不考虑
className = className.replace(/[^a-z0-9]/gi, '');
答案 0 :(得分:0)
user2864740在评论
中回答只要您信任className,它就是“安全的”。
这是有道理的,但也引导我注意用户定义的“代码”的位置。
该字符串是在function
关键字和一组括号之间注入的。因此,如果classname
不是有效的函数名,则会发生错误。
答案 1 :(得分:0)
displayName
的属性,Firefox Developer Tools,Firebug和Google Chrome Developer Tools(部分)支持该属性:function generateClass(name, constructor, prototype) {
'use strict';
var classPrototype = constructor.prototype;
for (var key in prototype) {
classPrototype[key] = prototype[key]
if (typeof classPrototype[key] === 'function') classPrototype[key].displayName = name + '.' + key;
}
constructor.displayName = name;
return constructor;
};
var Person = generateClass('Person', function(name) {
this.name = name || 'John Smith';
}, {
sayHello: function() {
alert('Hello from ' + this.name + '!');
}
});
// Try these in the console:
Person;
new Person('James Smith');
请注意,您可以使用displayName
的任何字符串,例如var MalePerson = generateClass('My Person', ...
。
displayName
:var Person = generateClass('Person', function(name) {
this.name = name || 'John Smith';
this.constructor.displayName = 'Person (' + this.name + ')';
}, {
sayHello: function() {
alert('Hello from ' + this.name + '!');
}
});
// Try this in the console:
new Person('James Smith');
答案 2 :(得分:0)
这些功能在哪里定义?如果它们在全局范围内定义,则可以执行以下操作:
var name="fun";
window[name]=function(){};
window[name].name=name;