2013-03-14 5 views
0

Я хочу, чтобы эмулировать классы в JavaScript, и придумал эту схему ...Javasctipt класс модель с именем класса повторяющейся

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

Существует множество библиотек классов JS, некоторые из которых поддерживают деривацию классов и доступ к базовому классу. Весь хороший полиморфизм. Не изобретайте велосипед здесь. Только мои два цента. –

+0

Мне не нужна библиотека, я хочу создать образец, который я помню, и использовать везде. –

+0

Я бы предложил прочитать: http://ejohn.org/blog/simple-class-instantiation/ как шаблон многократного использования. –

ответ

1

Это очень неэффективный шаблон, поскольку он создает новый конструктор для каждого вызова и не использует наследование прототипов. Кроме того, в зависимости от капитализации, чтобы указать, что конструктор не подходит для обслуживания. По крайней мере, с new Foo() ясно, что возвращается новый экземпляр.

Если вам не нравится использовать new (и я не могу понять, почему), то оберните конструкторы в вызывающей функции с именем, которое указывает, что они делают, например newRandom или аналогичным.

Что касается кода, я не знаю, почему вы используете выражения функций, а не декларации. Там нет необходимости использовать то же имя для внутренней функции как внешний, на самом деле внутренняя функция не нужно имя на всех:

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

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

, но я не предлагаю вам сделать это.

Смежные вопросы