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メインコードで使用するのが好きではないので、インスタンスを返すことができるように、クラスを2回ラップします。

最も珍しいのは、両方のラッパーに同じクラス名を使用していることです。このパターンに技術的な問題はありますか?

同じことを達成するためのより簡単な方法はありますか?

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 に答える