国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
類和模塊

一、類

  JavaScript中類的實現(xiàn)是基于原型機制的。如果兩個實例都從同一個原型上繼承屬性,則他們它們是同一個類的實例,類的所有實例對象都從同一個原型對象上繼承屬性。

   使用構(gòu)造函數(shù)定義類

 1 //使用構(gòu)造函數(shù)定義一個范圍類 2 function Range(from,to){ 3     this.from=from; 4     this.to=to; 5 } 6 Range.prototype={ 7     //定義構(gòu)造器屬性 8     constructor:Range, 9     //判斷x是否在范圍內(nèi)10     include:function (x){11         return this.from<=x&&x<=this.to;12     },13      //對范圍內(nèi)的每一個整數(shù)執(zhí)行f;14     foreach:function (f){15         for(var i=Math.ceil(this.from);i<=this.to;i++)16         {17             f(i);18         }19     },20     //返回表示范圍的字符串21     toString(){22         return this.from+'...'+this.to;23     }  24 }25 //調(diào)用構(gòu)造函數(shù)26 var range=new Range(1,10);27 console.log(range.include(5));//true28 range.foreach((ele)=>{console.log(ele)});//1  2  3  4 5..1029 console.log(range.toString());//1...10

  構(gòu)造函數(shù)是類的公共表示(往往代表類明),而原型對象是類的唯一標(biāo)識。

   類的實例是一個獨立的對象,直接給實例定義的屬性不會被所有實例共享??梢杂脕砟M實例字段。

   原型對象的屬性和方法或被類的實例所共享,可以用來模擬類的實例方法。

   構(gòu)造函數(shù)上定義的方法可以直接用構(gòu)造函數(shù)對象調(diào)用,可以用來模擬類的方法(通過類名調(diào)用)

   java中用final表示聲明字段為常量。JavaScript可以使用屬性名字全部大寫來暗示這是一個常量。

   java中可以把字段設(shè)置為私有成員(類的外部不可見)。JavaScript中使用屬性名以下劃線開始暗示這是一個私有變量。 

 1 //使用構(gòu)造函數(shù)定義一個范圍類 2 function Range(from,to){ 3     //定義實例方法:對象字段;保存對象的獨立狀態(tài) 4     this.from=from; 5     this.to=to; 6 } 7     //定義實例方法:所有實例共享 8 Range.prototype={ 9     //定義構(gòu)造器屬性10     constructor:Range,11     //判斷x是否在范圍內(nèi)12     include:function (x){13         return this.from<=x&&x<=this.to;14     },15      //對范圍內(nèi)的每一個整數(shù)執(zhí)行f;16     foreach:function (f){17         for(var i=Math.ceil(this.from);i<=this.to;i++)18         {19             f(i);20         }21     },22     //返回表示范圍的字符串23     toString(){24         return this.from+'...'+this.to;25     }  26 }27 //類的方法和屬性28 Range.NAME='Range';//大寫表示只讀的。29 Range._format="";//下劃線表示它是私有變量  

可以將上面的過程封裝成一個defineClass方法。

 

 1 //將p對象的屬性復(fù)制到o對象,覆蓋同名方法 2 //構(gòu)造器屬性只能復(fù)制值 3 function extend(o, p) { 4     for (var s in p) { 5         if (p.hasOwnProperty(s)) 6             o[s] = p[s]; 7     } 8     return o; 9 }10 function defineClass(constructor, method, static) {11     //constructor代表創(chuàng)建類的構(gòu)造函數(shù)12     //method  實例方法13     //static 類方法14     if (method)15         extend(constructor.prototype, method);16     if (static)17         extend(constructor, static);18     return constructor;19 }20 //定義一個SimpleRange21 var SimpleRange = defineClass(function () { this.x = 1; this.y = 2 },22     { add: function () { return 10 } },23     { pi: 3.14 });24 var s=new SimpleRange();25 console.log(SimpleRange.pi)//3,1426 console.log(s.x);//127 console.log(s.add());//10

 

二、類的擴充

  JavaScript基于原型的繼承是動態(tài)的,給對象的原型添加的方法,繼承這個原型對象也會繼承這些方法。   

1 Pange.prototype.toJson=function(){2     return ....//3 }

  類的實例對象都會添加toJson();

  我們可以內(nèi)置對象的原型上添加方法,是內(nèi)置對象都可以使用這個方法。

三、檢測對象類的方法 

   intanceof、對象的constructor屬性、isprototype()    

1 var o={};2 console.log(o instanceof Object);//true3 console.log(Object.prototype.isPrototypeOf(o));//true4 console.log(o.constructor);//Object函數(shù)的引用

  intanceof和constructor屬性會在web應(yīng)用存在問題,web的框架和多窗中會有獨立的上限下文,獨立上下文包含獨立的變量和構(gòu)造方法。一個框架頁面中的數(shù)組不是另一個框架頁面中Array()的實例,所以instance和constructor返回false;

四. 面向?qū)ο蠹夹g(shù)

定義一個集合類Set

 

 1 //定義集合類 :將傳入的值建立一個唯一的到字符串的映射,然后將字符串和值保存進對象中 2  3 //定義一個構(gòu)造函數(shù) 4 function Set() { 5     //用于將值保存在對象中 6     this.value = {}; 7     //集合中值得個數(shù) 8     this.n = 0; 9     //初始化集合中的值。10     this.add.apply(this, arguments);11 }12 //定義一個類內(nèi)部使用的私有屬性;用來產(chǎn)生值對應(yīng)的字符串13 Set._v2s = function (val) {14     switch (val) {15         case undefined: return "u";16         case null: return 'n';17         case true: return 't';18         case false: return 'f';19         default: switch (typeof val) {20             case "number": return "#" + val;21             case "string": return '"' + val;22             default: return "@" + objectid(val);23         }24     }25 }26 //生成對象的id方法27 function objectid(val) {28     //相同的對象產(chǎn)生相同的id,不同的對象產(chǎn)生不同的id29     var prop = "|*prop*|";//定義一個私有屬性30     if (!val.hasOwnProperty(prop))31         val[prop] = Set._v2s.next++;32     return val[prop];33 }34 //定義一個類屬性35 Set._v2s.next = 100;36 //給集合添加實例方法37 Set.prototype.add = function () {38     for (var i = 0; i < arguments.length; i++) {39         var val = arguments[i];40         //得到值到字符串的映射41         var str = Set._v2s(val);42         //檢驗集合中是否存在這個字符串43         if (!this.value.hasOwnProperty(str)) {44             //當(dāng)集合中不存在這個值時,將值保存近集合45             this.value[str] = val;46             this.n++;47         }48     }49     return this;//支持鏈?zhǔn)骄幊?/span>50 }51 //刪除集合中的值52 Set.prototype.remove = function () {53     for (var i = 0; i < arguments.length; i++) {54         var val = arguments[i];55         //得到值到字符串的映射56         var str = Set._v2s(val);57         //檢驗集合中是否存在這個字符串58         if (this.value.hasOwnProperty(str)) {59             //當(dāng)集合中存在這個值時,將值刪除60             delete this.value[str]61             this.n--;62         }63     }64     return this;//支持鏈?zhǔn)骄幊?/span>65 }66 //判斷集合中是否有這個值67 Set.prototype.contains = function (val) {68     var str = Set._v2s(val);69     return val.hasOwnProperty(str);70 }71 //遍歷集合,使用指定的上下文執(zhí)行f函數(shù)72 Set.prototype.forEach=function(f,content){73    for(var p in this.value){74        if(this.value.hasOwnProperty(p)){75            f.call(content,this.value[p]);76        }77    }78    return this;79 }80 //返回集合的大小81 Set.prototype.size=function(){82     return this.n;83 }84 //創(chuàng)建一個集合85 var set=new Set(1,2,3);86 set.add(4,5,6,{},{},{x:1});87 set.remove(4,5);88 set.forEach((ele)=>{console.log(ele)});89 console.log(set.size());90 console.log(set.contains(1));

 

五、標(biāo)準(zhǔn)轉(zhuǎn)化方法

  應(yīng)該給類的原型上定義一些標(biāo)準(zhǔn)轉(zhuǎn)發(fā)方法:toString()、valueOf()、toJSON()、toLocalString()。這些方法在對象的類型轉(zhuǎn)換時會用到。如果沒有定義最好是刻意為之而不是忘了定義。

  對象的比較是引用的比較,我們可以自己在原型定義一類比較方法。

六、方法借用

  多個類中的方法可以共用一個函數(shù),我們稱之為方法借用。

  如;Set.prototype.equals=A.equals;

七、可以利用閉包實現(xiàn)變量的私有 

 1 //變量只能被類的實例方法訪問,類的外面不可見 2 function Range(from,to){ 3     this.from=function(){ 4         return from; 5     } 6     this.to=function(){ 7         return to; 8     } 9 }10 Range.prototype.include=function(x){11     return this.from()<=x&&x<=this.to;12 }

 

八、構(gòu)造方法的重載和工廠方法

  有時候,我們希望對象的初始化有多種方式,比如我們用構(gòu)造函數(shù)創(chuàng)建初始化一個數(shù)組。

  

 

  

  

 

  

  

  

 

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
針對 Java 開發(fā)人員的 Dojo 概念
萬字長文深度剖析面向?qū)ο蟮膉avascript
JavaScript ES6函數(shù)式編程(三):函子
ES6 class(基本語法+方法)
學(xué)習(xí) JavaScript 最難點之一
JS學(xué)習(xí)筆記 原型鏈和利用原型實現(xiàn)繼承
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服