精品伊人久久大香线蕉,开心久久婷婷综合中文字幕,杏田冲梨,人妻无码aⅴ不卡中文字幕

打開APP
userphoto
未登錄

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

開通VIP
類和模塊

一、類

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

   使用構造函數定義類

 1 //使用構造函數定義一個范圍類 2 function Range(from,to){ 3     this.from=from; 4     this.to=to; 5 } 6 Range.prototype={ 7     //定義構造器屬性 8     constructor:Range, 9     //判斷x是否在范圍內10     include:function (x){11         return this.from<=x&&x<=this.to;12     },13      //對范圍內的每一個整數執行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 //調用構造函數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

  構造函數是類的公共表示(往往代表類明),而原型對象是類的唯一標識。

   類的實例是一個獨立的對象,直接給實例定義的屬性不會被所有實例共享。可以用來模擬實例字段。

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

   構造函數上定義的方法可以直接用構造函數對象調用,可以用來模擬類的方法(通過類名調用)

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

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

 1 //使用構造函數定義一個范圍類 2 function Range(from,to){ 3     //定義實例方法:對象字段;保存對象的獨立狀態 4     this.from=from; 5     this.to=to; 6 } 7     //定義實例方法:所有實例共享 8 Range.prototype={ 9     //定義構造器屬性10     constructor:Range,11     //判斷x是否在范圍內12     include:function (x){13         return this.from<=x&&x<=this.to;14     },15      //對范圍內的每一個整數執行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對象的屬性復制到o對象,覆蓋同名方法 2 //構造器屬性只能復制值 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代表創建類的構造函數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基于原型的繼承是動態的,給對象的原型添加的方法,繼承這個原型對象也會繼承這些方法。   

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

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

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

三、檢測對象類的方法 

   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函數的引用

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

四. 面向對象技術

定義一個集合類Set

 

 1 //定義集合類 :將傳入的值建立一個唯一的到字符串的映射,然后將字符串和值保存進對象中 2  3 //定義一個構造函數 4 function Set() { 5     //用于將值保存在對象中 6     this.value = {}; 7     //集合中值得個數 8     this.n = 0; 9     //初始化集合中的值。10     this.add.apply(this, arguments);11 }12 //定義一個類內部使用的私有屬性;用來產生值對應的字符串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     //相同的對象產生相同的id,不同的對象產生不同的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             //當集合中不存在這個值時,將值保存近集合45             this.value[str] = val;46             this.n++;47         }48     }49     return this;//支持鏈式編程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             //當集合中存在這個值時,將值刪除60             delete this.value[str]61             this.n--;62         }63     }64     return this;//支持鏈式編程65 }66 //判斷集合中是否有這個值67 Set.prototype.contains = function (val) {68     var str = Set._v2s(val);69     return val.hasOwnProperty(str);70 }71 //遍歷集合,使用指定的上下文執行f函數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 //創建一個集合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));

 

五、標準轉化方法

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

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

六、方法借用

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

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

七、可以利用閉包實現變量的私有 

 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 }

 

八、構造方法的重載和工廠方法

  有時候,我們希望對象的初始化有多種方式,比如我們用構造函數創建初始化一個數組。

  

 

  

  

 

  

  

  

 

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

聯系客服

主站蜘蛛池模板: 竹山县| 霍山县| 洞口县| 嘉鱼县| 富蕴县| 大理市| 宜宾县| 交口县| 孟州市| 怀化市| 盐边县| 丽江市| 渭南市| 临潭县| 阿图什市| 土默特右旗| 大关县| 丰台区| 邢台市| 牙克石市| 泽州县| 井陉县| 通山县| 东阳市| 仁化县| 铜梁县| 龙南县| 昌图县| 石河子市| 武隆县| 屏南县| 临安市| 平顺县| 灯塔市| 曲阳县| 翼城县| 沐川县| 库尔勒市| 齐齐哈尔市| 长兴县| 黑龙江省|