我想在javascript中模拟类,并提出了这个方案......
var Random = function(a){ // class name used here
var Random = function(a){ // and used again here
this.valueOf = function(){
return Math.random()
}
this.under = function(limit){
return this*limit
}
this.floor = function(limit){
return Math.floor(this*limit)
}
}
return new Random(a)
}
var rnd = Random()
console.log(rnd*20<<0)
对我来说命名似乎很常见,TitelCase中的类名和camelCase中的实例。我将类包装两次,以便我可以返回一个实例,因为我不喜欢在我的主代码中使用new Thing
。
让我觉得最不寻常的事情就是为两个包装器使用相同的类名。这种模式有任何技术问题吗?
有没有更简单的方法来实现同样的目标?
答案 0 :(得分:1)
这是一个非常低效的模式,因为它在每次调用时都会创建一个新的构造函数,并且它不会利用原型继承。另外,仅取决于大写以表示构造函数不利于维护。至少使用new Foo()
,很明显正在返回一个新实例。
如果你不喜欢使用new
(我无法理解为什么),那么将构造函数包装在一个调用函数中,其名称可以表示它们的作用,如newRandom
或类似的。
关于代码,我不知道你为什么使用函数表达式而不是声明。内部函数不需要使用与外部函数相同的名称,实际上内部函数根本不需要名称:
function X(name) {
return new (function(name) {
this.name = name;
})(name)
}
var a = X('a');
a.name; // a
但我并不是建议你这样做。