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

回答

1

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

不,我所看到的,但你需要向我們展示實際使用情況下這不是一個演示的例子:-)

你有任何改進的建議?

循環執行Object.keys(cons)和使用i爲別的,但keys[i]是容易出錯,因爲Object.keys不保證任何順序。它也可能發生bmw.power"BMW"bmw.name500

+0

有效點,您在對象中聲明屬性的順序不是循環順序所必需的。謝謝你指出這一點,以後會讓我頭痛。 – 2013-03-12 12:52:24