<dfn id="w48us"></dfn><ul id="w48us"></ul>
  • <ul id="w48us"></ul>
  • <del id="w48us"></del>
    <ul id="w48us"></ul>
  • 理解JavaScript中的封裝與繼承特性

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

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

      JavaScript中的封裝

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

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

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

      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"來創(chuàng)建。

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

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

      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的結果。可以看到這個例子與門戶大開型的區(qū)別,門戶大開型中的變量使用"this"來創(chuàng)建,而這個例子中使用var來創(chuàng)建,check函數(shù)也是如此,使得name與check函數(shù)只能在構造函數(shù)的作用域中訪問,外界無法直接訪問。

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

      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; }

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

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

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

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

      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中執(zhí)行JavaScript代碼07-14

    Javascript中typeof 用法歸納09-27

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

    主站蜘蛛池模板: 久久精品成人免费网站| 国产在线国偷精品免费看| 老司机91精品网站在线观看| 亚洲精品无码成人片在线观看| 91po国产在线精品免费观看| 国产午夜无码精品免费看动漫| 亚洲av无码成人精品区| 国产精品偷窥熟女精品视频 | 国产成人精品综合久久久| 91精品国产自产在线观看永久| 无码aⅴ精品一区二区三区浪潮| 无码日韩精品一区二区人妻| 国产精品综合专区中文字幕免费播放 | 国产在线精品免费aaa片| 午夜精品久久久久久久久| 亚洲?V无码乱码国产精品| 精品一区二区三区色花堂| 国产精品成人99久久久久| 亚洲国产成人久久精品动漫| 国产亚洲一区二区精品| 国产suv精品一区二区33| 精品9E精品视频在线观看 | 亚洲精品尤物yw在线影院| 欧美在线精品永久免费播放| 久久国产美女免费观看精品 | 大伊香蕉精品一区视频在线 | 精品久久久久久国产潘金莲| 久久香综合精品久久伊人| 久久精品国产亚洲AV无码麻豆| 色欲久久久天天天综合网精品| 亚洲AV永久纯肉无码精品动漫 | 午夜精品一区二区三区在线观看| 老年人精品视频在线| 无码欧精品亚洲日韩一区夜夜嗨 | 国产精品久久久久AV福利动漫| 国产最新进精品视频| 2022国产精品不卡a| 精品精品国产自在久久高清| 午夜精品美女自拍福到在线| 国产成人精品免费大全| 精品国偷自产在线视频|