功能来创建类

问题描述:

我想创建一个强大的方式来定义类的“即时”,但我害怕在整个过程中添加不必要的开销。功能来创建类

这里是我创建代码:

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 2013-03-12 12:00:31

我是否在做任何不必要的事情?

不,我所看到的,但你需要向我们展示实际使用情况下这不是一个演示的例子:-)

你有任何改进的建议?

循环执行Object.keys(cons)和使用i为别的,但keys[i]是容易出错,因为Object.keys不保证任何顺序。它也可能发生bmw.power"BMW"bmw.name500

+0

有效点,您在对象中声明属性的顺序不是循环顺序所必需的。谢谢你指出这一点,以后会让我头痛。 – 2013-03-12 12:52:24