嚴格來講,javascript沒有類,但爲了便於理解,咱們將類和對象當作同一個概念來講。javascript
javascript有不少種定義類的方式,這還真有點狗血,選擇太多必然增長了語言的複雜度,因此咱們須要評估、選擇合適的方式。java
類或對象定義編程
咱們先看看JAVA類定義方式函數
class Car { public String color = "blue"; public int doors = 4; public int mpg = 25; public Car(String color, int doors, int mpg) { this.color = color; this.doors = doors; this.mpg = mpg; } public void showColor() { System.out.println(color); } }
javascritp推薦定義方式:混合構造函數和原型的方式性能
function Car(sColor,iDoors,iMpg) { this.color = sColor; this.doors = iDoors; this.mpg = iMpg; this.drivers = new Array("Mike","John"); } Car.prototype.showColor = function() { //使用Car對象的原型添加方法showColor alert(this.color); };
//到這裏,類定義完成 var oCar1 = new Car("red",4,23); var oCar2 = new Car("blue",3,25);
oCar1.triger=function(){ //給類實例oCar1對象添加一個方法triger
//body
}
oCar1.drivers.push("Bill"); alert(oCar1.drivers); //輸出 "Mike,John,Bill" alert(oCar2.drivers); //輸出 "Mike,John"
一、首先定義了構造函數構造函數Car,構造函數具備多個參數,這裏只定義屬性,屬性值可經過參數值傳遞進行初始化。請注意函數屬性的定義方式,須要使用this,this的值是實例化類this
後的對象。spa
二、Car.prototype是調用類的原型,爲原型增長方法showColor,爲其賦值一個匿名函數,這樣就算給類car定義了方法,還記得前面說到嗎,類的方法就是賦值給一個類屬性的函數。prototype
三、oCar1是類Car的實例,new操做符建立了一個沒有任何屬性的對象,而後調用構造函數,若是構造函數有參數,能夠給參數賦值。新的對象會賦值給this,code
這就是一個類定義,包括定義屬性和方法,並經過類實例化對象的過程。對象
類或對象動態性
javascript這類弱類型語言,一般也稱爲動態語言,弱類型帶來修改類型的靈活性。想一想JAVA,類都是預先定義好的,實例化成對象以後,運行過程當中通常都不會修改。採用反射自省方式才能動態修改類,每每成爲高級編程技巧,且會很是大的影響性能。
使用prototype,能夠很是方便的爲任意對象修改屬性和方法。
建立新方法
Number.prototype.toHexString = function() { return this.toString(16); }; // 爲Number對象建立新方法
重命名方法
Array.prototype.enqueue = function(vItem) { this.push(vItem); }; Array.prototype.dequeue = function() { return this.shift(); }; //添加兩個新方法封裝覆蓋了已有方法
爲本地對象添加方法
Object.prototype.showValue = function () { alert(this.valueOf()); }; var str = "hello"; var iNum = 25; str.showValue(); //輸出 "hello" iNum.showValue(); //輸出 "25" // 給 ECMAScript 中每一個本地對象添加新方法,必須在 Object 對象的 prototype 屬性上定義它。全部本地對象都繼承了 Object 對象,因此對 Object 對象作任何改變,都會反應在全部本地對象上。
定義類的時候可考慮定義的方法