0

我想在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在我的主代码中使用。

让我印象最不寻常的是对两个包装器使用相同的类名。这种模式有什么技术问题吗?

有没有更简单的方法来实现同样的事情?

4

1 回答 1

1

这是一种非常低效的模式,因为它在每次调用时都会创建一个新的构造函数,并且不利用原型继承。此外,仅依靠大小写来指示构造函数不利于维护。至少new Foo()很明显,正在返回一个新实例。

如果你不喜欢使用new(我不明白为什么),那么将构造函数包装在一个调用函数中,并使用一个名称来表明它们的作用、喜欢newRandom或类似。

关于代码,我不知道您为什么使用函数表达式而不是声明。内部函数不需要与外部函数使用相同的名称,实际上内部函数根本不需要名称:

function X(name) {
  return new (function(name) {
    this.name = name;
  })(name)
}

var a = X('a');
a.name; // a

但我不建议你这样做。

于 2013-03-14T23:19:30.110 回答