| 導購 | 订阅 | 在线投稿
分享
 
 
 

Javascript對象定義的幾種方式

2008-09-09 07:29:21  編輯來源:互聯網  简体版  手機版  評論  字體: ||
 
  一.工廠方式:先創建對象,再向對象添加方法和屬性,封閉後調用不要使用new操作符創建對象。使用這種方法有很多弊端,把方法定義在工廠函數內部的時候,每次調用的時候都會産生新的函數

  function factory(name,person,address,time){

   var tmp=new Object;

   tmp.name=name;

   tmp.person=person;

   tmp.address=address;

   tmp.workTime=function(){

   alert("we start to work at" + time);

   }

   return tmp;

  }

  var factory1=factory("drugs",100,"huashan Rd",10);

  var factory2=factory("TCMdrugs",100,"hongqiao Rd",11);

  factory1.workTime();

  factory2.workTime();//Here,factory1 and factory2 have different method

  對這種問題雖然可以用下面的方式改進,但是缺乏很好的封裝性

  function factory(name,person,address,time){

   var tmp=new Object;

   tmp.name=name;

   tmp.person=person;

   tmp.address=address;

   tmp.workTime=workTime();

   return tmp;

  }

  function workTime(){

   alert("we start to work at" + this.time);

  }

  二,構造函數方式,在構造函數內部不創建對象,使用this關鍵字,使用時候用new操作符,存在和工廠方式相同的問題,重複創建函數。

  function counstruct(name,person,address,time){

   this.name=name;

   this.person=person;

   this.address=address;

   this.workTime=function(){

   alert("we start to work at" + this.time);

   };

  }

  三.原型方式:利用prototype屬性來實現屬性和方法,可以通過instanceof 檢查對象類型,解決了重複創建函數的問題,但不能通過傳遞參數初始化屬性

  function Car(){

  }

  Car.prototype.color = "red";

  Car.prototype.doors = 4;

  Car.prototype.mpg = 23;

  Car.prototype.showColor = function(){

   alert(this.color);

  };

  var car1 = new Car();

  var car2 = new Car();

  但是如果遇到下面的情況,又出問題了

  Car.prototype.drivers = new Array("mike", "sue");

  car1.drivers.push("matt");

  alert(car1.drivers); //outputs "mike,sue,matt"

  alert(car2.drivers); //outputs "mike,sue,matt"

  drivers是指向Array對象的指針,Car的兩個實例都指向同一個數組。

  四.混合的構造函數/原型方式:針對原型方式的解決方案

  function Car(sColor, iDoors, iMpg){

   this.color = sColor;

   this.doors = iDoors;

   this.mpg = iMpg;

   this.drivers = new Array("mike", "sue");

  }

  Car.prototype.showColor = function (){

   alert(this.color);

  };

  var car1 = new Car("red", 4, 23);

  var car2 = new Car("blue", 3, 25);

  car1.drivers.push("matt");

  alert(car1.drivers);

  alert(car2.drivers);

  五.動態原型方式:這種方式是極力推薦的方式,避免了前面幾種方式所出現的問題,提供了更友好的編碼風格

  function Car(sColor, iDoors, iMpg){

   this.color = sColor;

   this.doors = iDoors;

   this.mpg = iMpg;

   this.drivers = new Array("mike", "sue");

  

   if(typeof Car.initialized == "undefined"){

   Car.prototype.showColor = function (){

   alert(this.color);

   };

   Car.initialized = true;

   }

  }

  var car1 = new Car("red", 4, 23);

  var car2 = new Car("blue", 3, 25);

  car1.drivers.push("matt");

  alert(car1.drivers);

  alert(car2.drivers);

  六.混合工廠方式:和工廠方式有些相似,但采用new關鍵字實例化,具有和工廠方式相同的弊端,不推薦使用
 
一.工廠方式:先創建對象,再向對象添加方法和屬性,封閉後調用不要使用new操作符創建對象。使用這種方法有很多弊端,把方法定義在工廠函數內部的時候,每次調用的時候都會産生新的函數 function factory(name,person,address,time){ var tmp=new Object; tmp.name=name; tmp.person=person; tmp.address=address; tmp.workTime=function(){ alert("we start to work at" + time); } return tmp; } var factory1=factory("drugs",100,"huashan Rd",10); var factory2=factory("TCMdrugs",100,"hongqiao Rd",11); factory1.workTime(); factory2.workTime();//Here,factory1 and factory2 have different method 對這種問題雖然可以用下面的方式改進,但是缺乏很好的封裝性 function factory(name,person,address,time){ var tmp=new Object; tmp.name=name; tmp.person=person; tmp.address=address; tmp.workTime=workTime(); return tmp; } function workTime(){ alert("we start to work at" + this.time); } 二,構造函數方式,在構造函數內部不創建對象,使用this關鍵字,使用時候用new操作符,存在和工廠方式相同的問題,重複創建函數。 function counstruct(name,person,address,time){ this.name=name; this.person=person; this.address=address; this.workTime=function(){ alert("we start to work at" + this.time); }; } 三.原型方式:利用prototype屬性來實現屬性和方法,可以通過instanceof 檢查對象類型,解決了重複創建函數的問題,但不能通過傳遞參數初始化屬性 function Car(){ } Car.prototype.color = "red"; Car.prototype.doors = 4; Car.prototype.mpg = 23; Car.prototype.showColor = function(){ alert(this.color); }; var car1 = new Car(); var car2 = new Car(); 但是如果遇到下面的情況,又出問題了 Car.prototype.drivers = new Array("mike", "sue"); car1.drivers.push("matt"); alert(car1.drivers); //outputs "mike,sue,matt" alert(car2.drivers); //outputs "mike,sue,matt" drivers是指向Array對象的指針,Car的兩個實例都指向同一個數組。 四.混合的構造函數/原型方式:針對原型方式的解決方案 function Car(sColor, iDoors, iMpg){ this.color = sColor; this.doors = iDoors; this.mpg = iMpg; this.drivers = new Array("mike", "sue"); } Car.prototype.showColor = function (){ alert(this.color); }; var car1 = new Car("red", 4, 23); var car2 = new Car("blue", 3, 25); car1.drivers.push("matt"); alert(car1.drivers); alert(car2.drivers); 五.動態原型方式:這種方式是極力推薦的方式,避免了前面幾種方式所出現的問題,提供了更友好的編碼風格 function Car(sColor, iDoors, iMpg){ this.color = sColor; this.doors = iDoors; this.mpg = iMpg; this.drivers = new Array("mike", "sue"); if(typeof Car.initialized == "undefined"){ Car.prototype.showColor = function (){ alert(this.color); }; Car.initialized = true; } } var car1 = new Car("red", 4, 23); var car2 = new Car("blue", 3, 25); car1.drivers.push("matt"); alert(car1.drivers); alert(car2.drivers); 六.混合工廠方式:和工廠方式有些相似,但采用new關鍵字實例化,具有和工廠方式相同的弊端,不推薦使用
󰈣󰈤
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
王朝網路微信公眾號
微信掃碼關註本站公眾號 wangchaonetcn
 
  免責聲明:本文僅代表作者個人觀點,與王朝網絡無關。王朝網絡登載此文出於傳遞更多信息之目的,並不意味著贊同其觀點或證實其描述,其原創性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,並請自行核實相關內容。
 
© 2005- 王朝網路 版權所有