中文字幕在线一区二区在线,久久久精品免费观看国产,无码日日模日日碰夜夜爽,天堂av在线最新版在线,日韩美精品无码一本二本三本,麻豆精品三级国产国语,精品无码AⅤ片,国产区在线观看视频

      理解JavaScript中的封裝與繼承特性

      時間:2024-09-01 06:50:51 JavaScript 我要投稿
      • 相關推薦

      理解JavaScript中的封裝與繼承特性

        JavaScript中的封裝

        封裝簡單地說就是讓外界只能訪問對象的共有變量和函數,隱藏細節和數據。

        js中有三種方法創建對象,分別為門戶大開型、用命名規范區分私有變量、閉包創建真正的私有變量三種。

        1.門戶大開型,是實現對象的最基礎的方法,所有方法與變量都是共有的外界可以訪問。

        var Book = function(name){ if(this.check(name)){ console.log("error"); throw new Error("name null"); } this.name = name; } Book.prototype = { check:function(name){ if(!name){ return true; } }, getName:function(){ return this.name; } } var book = new Book("哈哈"); //output:哈哈 哈哈 console.log(book.name,book.getName());

        這個例子是門戶大開型的典型,外界能直接訪問對象的屬性和方法。可以注意到屬性和變量都有"this"來創建。

        2.用命名規范區分私有變量,該方法是門戶大開型的優化版本,只不過是在私有變量或方法前面用"_"區分,如果有程序員有意使用_getName()的方法來調用方法,還是無法阻止的,不是真正地將變量隱藏。

        3.閉包創建真正的私有變量,該方法利用js中只有函數具有作用域的特性,在構造函數的作用域中定義相關變量,這些變量可以被定義域該作用域中的所有函數訪問。

        var Book2 = function(name){ if(check(name)){ console.log("error"); throw new Error("name null"); } name = name; function check(name){ if(!name){ return true; } } this.getName = function(){ return name; } } Book2.prototype = { display:function(){ //無法直接訪問name return "display:"+this.getName(); } } var book2 = new Book2("哈哈"); //output:undefined "哈哈" "display:哈哈" console.log(book2.name,book2.getName(),book2.display());

        可以看到,這個例子中的結果,直接訪問name會返回undefined的結果。可以看到這個例子與門戶大開型的區別,門戶大開型中的變量使用"this"來創建,而這個例子中使用var來創建,check函數也是如此,使得name與check函數只能在構造函數的作用域中訪問,外界無法直接訪問。

        該方法解決了前兩種方法的問題,但是也有一定的弊端。在門戶大開型對象創建模式中,所有方法都創建在原型對象中,因此不管生成多少對象實例,這些方法在內存中只存在一份,而采用該方法,每生成一個新的對象都會為每個私有變量和方法創建一個新的副本,故會耗費更多的內存。

        JavaScript中的繼承

        Book基類:

        var Book = function(name){ if(this.check(name)){ console.log("error"); throw new Error("name null"); } this.name = name; } Book.prototype = { check:function(name){ if(!name){ return true; } }, getName:function(){ return this.name; } }

        繼承方法:

        function extend(subClz,superClz){ var F = function(){} F.prototype = superClz.prototype; subClz.prototype = new F(); subClz.prototype.constructor = subClz; subClz.superClass = superClz.prototype; if(superClz.prototype.constructor == Object.prototype.constructor){ superClz.prototype.constructor = superClz; }

        使用空函數F作為橋接,可以避免直接實例化父類時調用父類的構造函數帶來額外開銷,而且當父類的構造函數有參數時,想直接通過subClass.prototype = new superClass();實現父類構造函數的調用和原型鏈的繼承是不行的。

        subClz.superClass = superClz.prototype; if(superClz.prototype.constructor == Object.prototype.constructor){ superClz.prototype.constructor = superClz; }

        添加這三句可以避免子類繼承父類寫Book.call(this,name);而是簡單地寫ArtBook.superClass.Constructor.call(this,name)便能實現。

        并且在子類重寫父類方法的時候,可以調用到父類的方法:

        ArtBook.prototype.getName = functiion(){ return ArtBook.superClass.getName.call(this) + "!!!"; }

        ArtBook子類:

        var ArtBook = function(name,price){ ArtBook.superClass.Constructor.call(this,name); this.price = price; } extend(ArtBook,Book); ArtBook.prototype.getPrice = function(){ return this.price; } ArtBook.prototype.getName = function(){ return ArtBook.superClass.getName.call(this)+"!!!"; }

      【理解JavaScript中的封裝與繼承特性】相關文章:

      對javascript的理解08-08

      javascript面向對象中的對象怎么理解09-02

      淺談javascript中的單線程理解08-16

      有關深入理解JavaScript中的并行處理的介紹10-14

      理解JavaScript原型鏈教程09-02

      javascript的閉包概念怎么理解06-15

      JavaScript中的with關鍵字07-24

      在Java中執行JavaScript代碼07-14

      Javascript中typeof 用法歸納09-27

      抽象語法樹在JavaScript中的應用08-18

      主站蜘蛛池模板: 国产一区二区三区最新视频| 久久精品视频按摩| 武宁县| 亚洲国产剧情一区在线观看| 亚洲老熟妇愉情magnet| 一区二区三区婷婷在线| 贵阳市| 一区二区三区蜜桃在线视频| 中文字幕成人乱码亚洲| 日产乱码一区二区国产内射| 久久青草国产免费观看| 普安县| 精品中文字幕手机在线 | 精品久久日产国产一区| 一区二区三区在线高清视频| 久久久久亚洲AV无码专区一区| 辽中县| 玉环县| 南召县| 临武县| 增城市| 黄浦区| 国产女主播免费在线观看| 湖南省| 阜新市| av无码电影一区二区三区| 建湖县| 99久久精品国产片| 应用必备| 亚洲区一区二在线视频| 亚洲专区在线观看第三页| 久久国产香蕉一区精品天美| 沙河市| 亚洲一区二区三区免费av在线| 国产精品毛片99久久久久 | 乱色视频中文字幕在线看| 国产激情视频免费观看| 日韩中文字幕三级有码区| 国产精品av在线一区二区三区| 国产一区二区三区观看视频 | 国产精品中文第一字幕|