2013-03-12 3 views
1

Я пытаюсь создать надежный способ определения классов «на лету», но я боюсь добавлять ненужные накладные расходы для всего процесса.Функция для создания класса

Вот мой код создания:

function Class(cons,proto) { 
    var keys = Object.keys(cons); 

    function _class() { 
     var i = keys.length; 
     while(i--) { 
      this[ keys[i] ] = arguments[i] || cons[keys[i]]; 
     } 
    } 

    if(proto) { 
     var f; 
     for (f in proto) { 
      _class.prototype[f] = proto[ f ]; 
     } 
    } 

    return _class 
} 

А вот как я хочу использовать его

var car = Class({ 
       "name": "A car", 
       "power": 900 
      }, 
      { 
       "honk": function() { alert("honk!") } 
      }); 


var bmw = new car("BMW", 500); 
bmw.honk();  // -> honk! 
console.log(bmw.name, bmw.power);  // -> BMW 500 

var generic = new car(); 
generic.honk = function() { alert("custom honk") }; 
generic.honk();  // -> custom honk! 

alert(bmw.honk === car.prototype.honk); // -> true 
alert(generic.honk === car.prototype.honk);  // -> false 

console.log(generic.name, generic.power);  // -> A car 900 

Могу ли я делать что-нибудь ненужное? Есть ли у вас предложения по улучшению? Пожалуйста, сообщите ваше мнение

+2

В javascript нет классов, поэтому в некотором смысле это всегда на лету. Есть так много способов, которые люди придумали для наследования, и все это сводится к тому, чтобы просто выбрать то, что вам нужно для данной задачи. Это действительно зависит от того, что будет 1. упростить остальную часть вашего кода. 2. Эффективно работать. В основном, это зависит от остальной части кода – Jodes

ответ

1

Я делаю что-то ненужное?

Не то, что я могу видеть, но вы должны были бы показать нам реальный случай использования для этого вместо демо-пример :-)

Есть ли у вас какие-либо предложения по улучшению?

Looping над Object.keys(cons) и используя i для чего другого, кроме keys[i] является errorprone, поскольку Object.keys не гарантирует порядок. Также может случиться так, что bmw.power - "BMW" и bmw.name - 500.

+0

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

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