自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

實(shí)現(xiàn)JavaScript編寫(xiě)類的方式

開(kāi)發(fā) 前端
構(gòu)造方法方式:這是最基本的也是最像Java寫(xiě)class的方式。這樣的方法簡(jiǎn)單明了, 也符合JAVAer的胃口, 但是每new一個(gè)新對(duì)象, 就會(huì)在內(nèi)存中分配一個(gè)sayName方法, 性能不是很好。

網(wǎng)上實(shí)現(xiàn)javascript寫(xiě)類的方法有很多, 總結(jié)下不外乎以下幾種. 我自己學(xué)習(xí)總結(jié)了一下.

構(gòu)造方法方式;原型方式;構(gòu)造方法+原型的混合方式

現(xiàn)在具體分析一下以上方式的優(yōu)缺點(diǎn):

構(gòu)造方法方式

這是最基本的也是最像Java寫(xiě)class的方式. 上代碼:

  1. //創(chuàng)建一個(gè)Student類  
  2.  function Student(name){  
  3.       this.name = name;  
  4.       this.sayName = function(){  
  5.           alert(this.name);  
  6.       };  
  7.  }  
  8.  //new兩個(gè)不同的Student.  
  9.  var jimmy = new Student('jimmy');  
  10.  var henry = new Student('henry');  
  11.  jimmy.sayName();//顯示jimmy  
  12.  henry.sayName();//顯示henry 

這樣的方法簡(jiǎn)單明了, 也符合JAVAer的胃口, 但是每new一個(gè)新對(duì)象, 就會(huì)在內(nèi)存中分配一個(gè)sayName方法, 性能不是很好.

原型方式

  1. //創(chuàng)建一個(gè)Student類  
  2.  //屬性和方法都通過(guò)Student.prototype設(shè)置  
  3.  function Student(name){  
  4.      Student.prototype = name;  
  5.      Student.prototype.sayName = function(){  
  6.          alert(this.name);  
  7.      }  
  8.  }  
  9.  //new兩個(gè)不同的Student.  
  10.  var jimmy = new Student('jimmy');  
  11.  var henry = new Student('henry');  
  12.  jimmy.sayName();//顯示henry!!!  
  13.  henry.sayName();//顯示henry!!! 

也許執(zhí)行的代碼和有些童鞋的期望有出入. 兩次alert都彈出henry! 其實(shí)很好理解. 屬性和方法都通過(guò)prototype設(shè)置. 不同對(duì)象的同一個(gè)屬性或者方法都指向同一個(gè)內(nèi)存, 所以henry是在jimmy后設(shè)置的. 所以henry把jimmy覆蓋了.

混合方式

構(gòu)造方法的方式可以為同一個(gè)類的每一個(gè)對(duì)象分配不同的內(nèi)存, 這很適合寫(xiě)類的時(shí)候設(shè)置屬性, 但是設(shè)置方法的時(shí)候我們就需要讓同一個(gè)類的不同對(duì)象共享同一個(gè)內(nèi)存了. 寫(xiě)方法用原型的方式***. 所以寫(xiě)類的時(shí)候需要把構(gòu)造方法和原型兩種方式混合著用. 廢話少說(shuō), 看代碼:

  1. //創(chuàng)建一個(gè)Student類  
  2.  //屬性通過(guò)構(gòu)造方法設(shè)置  
  3.  //方法通過(guò)Student.prototype設(shè)置  
  4.  function Student(name){  
  5.      this.name = name;  
  6.      Student.prototype.sayName = function(){  
  7.          alert(this.name);  
  8.      }  
  9.  }  
  10.  //new兩個(gè)不同的Student.  
  11.  var jimmy = new Student('jimmy');  
  12.  var henry = new Student('henry');  
  13.  jimmy.sayName();//顯示jimmy  
  14.  henry.sayName();//顯示henry 

so far so good. 同一類的不同對(duì)象, 屬性各自占有內(nèi)存, 方法共享同一內(nèi)存. 其實(shí)這里還是有一個(gè)小問(wèn)題:

每new一個(gè)新對(duì)象, 就會(huì)執(zhí)行一次

  1. Student.prototype.sayName = function(){  
  2.      alert(this.name);  

造成不必要的重復(fù)運(yùn)算. 可以在類里面設(shè)置一個(gè)標(biāo)記位, ***次執(zhí)行的時(shí)候給這個(gè)標(biāo)志位設(shè)置true, 如果為true就不再為prototype設(shè)置方法.

 

責(zé)任編輯:張偉 來(lái)源: jimmy_jia的博客
相關(guān)推薦

2023-05-22 15:35:10

JavaScriptWeb開(kāi)發(fā)

2011-03-07 09:41:10

JavaScript

2012-09-17 10:35:41

JavaScriptJS代碼

2011-03-08 09:15:04

JavaScript

2009-07-22 10:08:48

Javascript私

2011-06-27 13:57:42

JavaScript

2016-11-30 18:35:03

JavaScript

2014-11-25 10:03:42

JavaScript

2012-12-17 13:51:22

Web前端JavaScriptJS

2015-05-08 13:09:12

JavaScriipt抽獎(jiǎng)程序

2022-06-07 09:30:35

JavaScript變量名參數(shù)

2014-04-21 10:14:52

PromisesJavaScript

2013-04-15 09:02:43

JavaScriptJS

2021-06-09 10:45:12

JavaScript開(kāi)發(fā) 編程

2009-06-24 15:00:39

Javascript代

2010-01-27 17:08:01

Android Hel

2022-06-21 09:26:21

Shell腳本JavaScript

2009-11-27 15:31:33

PHP類搜索定位目錄樹(shù)

2011-05-25 16:23:35

Javascript類繼承

2009-01-04 09:08:30

面向?qū)ο?/a>繼承接口
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)