欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

簡(jiǎn)單理解JavaScript中的封裝與繼承特性

 更新時(shí)間:2016年03月19日 15:07:36   作者:sjpsega  
這篇文章主要介紹了JavaScript中的封裝與繼承特性,封裝與繼承是基于對(duì)象編程概念中的基本特性,需要的朋友可以參考下

JavaScript中的封裝
封裝簡(jiǎn)單地說(shuō)就是讓外界只能訪問(wèn)對(duì)象的共有變量和函數(shù),隱藏細(xì)節(jié)和數(shù)據(jù)。
js中有三種方法創(chuàng)建對(duì)象,分別為門(mén)戶(hù)大開(kāi)型、用命名規(guī)范區(qū)分私有變量、閉包創(chuàng)建真正的私有變量三種。
1.門(mén)戶(hù)大開(kāi)型,是實(shí)現(xiàn)對(duì)象的最基礎(chǔ)的方法,所有方法與變量都是共有的外界可以訪問(wè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()); 

這個(gè)例子是門(mén)戶(hù)大開(kāi)型的典型,外界能直接訪問(wèn)對(duì)象的屬性和方法??梢宰⒁獾綄傩院妥兞慷加?this"來(lái)創(chuàng)建。
 
2.用命名規(guī)范區(qū)分私有變量,該方法是門(mén)戶(hù)大開(kāi)型的優(yōu)化版本,只不過(guò)是在私有變量或方法前面用"_"區(qū)分,如果有程序員有意使用_getName()的方法來(lái)調(diào)用方法,還是無(wú)法阻止的,不是真正地將變量隱藏。
 
3.閉包創(chuàng)建真正的私有變量,該方法利用js中只有函數(shù)具有作用域的特性,在構(gòu)造函數(shù)的作用域中定義相關(guān)變量,這些變量可以被定義域該作用域中的所有函數(shù)訪問(wèn)。

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(){ 
    //無(wú)法直接訪問(wèn)name 
    return "display:"+this.getName(); 
  } 
} 
var book2 = new Book2("哈哈"); 
//output:undefined "哈哈" "display:哈哈" 
console.log(book2.name,book2.getName(),book2.display()); 

 可以看到,這個(gè)例子中的結(jié)果,直接訪問(wèn)name會(huì)返回undefined的結(jié)果??梢钥吹竭@個(gè)例子與門(mén)戶(hù)大開(kāi)型的區(qū)別,門(mén)戶(hù)大開(kāi)型中的變量使用"this"來(lái)創(chuàng)建,而這個(gè)例子中使用var來(lái)創(chuàng)建,check函數(shù)也是如此,使得name與check函數(shù)只能在構(gòu)造函數(shù)的作用域中訪問(wèn),外界無(wú)法直接訪問(wèn)。
該方法解決了前兩種方法的問(wèn)題,但是也有一定的弊端。在門(mén)戶(hù)大開(kāi)型對(duì)象創(chuàng)建模式中,所有方法都創(chuàng)建在原型對(duì)象中,因此不管生成多少對(duì)象實(shí)例,這些方法在內(nèi)存中只存在一份,而采用該方法,每生成一個(gè)新的對(duì)象都會(huì)為每個(gè)私有變量和方法創(chuàng)建一個(gè)新的副本,故會(huì)耗費(fèi)更多的內(nèi)存。

JavaScript中的繼承
Book基類(lèi):

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í)例化父類(lèi)時(shí)調(diào)用父類(lèi)的構(gòu)造函數(shù)帶來(lái)額外開(kāi)銷(xiāo),而且當(dāng)父類(lèi)的構(gòu)造函數(shù)有參數(shù)時(shí),想直接通過(guò)subClass.prototype = new superClass();實(shí)現(xiàn)父類(lèi)構(gòu)造函數(shù)的調(diào)用和原型鏈的繼承是不行的。

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

 
添加這三句可以避免子類(lèi)繼承父類(lèi)寫(xiě)B(tài)ook.call(this,name);而是簡(jiǎn)單地寫(xiě)ArtBook.superClass.Constructor.call(this,name)便能實(shí)現(xiàn)。
并且在子類(lèi)重寫(xiě)父類(lèi)方法的時(shí)候,可以調(diào)用到父類(lèi)的方法:

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

ArtBook子類(lèi):

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)+"!!!"; 
 } 

相關(guān)文章

  • 淺談JavaScript function函數(shù)種類(lèi)

    淺談JavaScript function函數(shù)種類(lèi)

    這篇文章主要介紹了JavaScript function函數(shù)種類(lèi),包括普通函數(shù)、匿名函數(shù)、閉包函數(shù)、十分的全面,并附上了示例,這里推薦給大家,希望對(duì)大家能有所幫助。
    2014-12-12
  • 簡(jiǎn)單談?wù)凧avascript函數(shù)中的arguments

    簡(jiǎn)單談?wù)凧avascript函數(shù)中的arguments

    在JavaScript中,arguments對(duì)象是比較特別的一個(gè)對(duì)象,實(shí)際上是當(dāng)前函數(shù)的一個(gè)內(nèi)置屬性。下面這篇文章主要介紹了關(guān)于Javascript函數(shù)中的arguments面貌以及如何轉(zhuǎn)化為數(shù)組的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-02-02
  • window.open的功能全解析

    window.open的功能全解析

    window.open的功能全解析...
    2006-10-10
  • 實(shí)例解析JS布爾對(duì)象的toString()方法和valueOf()方法

    實(shí)例解析JS布爾對(duì)象的toString()方法和valueOf()方法

    這篇文章主要介紹了JS的布爾對(duì)象的toString()方法和valueOf()方法,是JavaScript入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-10-10
  • 關(guān)于js中alert彈出窗口文本換行問(wèn)題簡(jiǎn)單詳細(xì)說(shuō)明

    關(guān)于js中alert彈出窗口文本換行問(wèn)題簡(jiǎn)單詳細(xì)說(shuō)明

    js中alert彈出窗口文本換行是一個(gè)小問(wèn)題,本人很是郁悶,于是搜集整理下,曬出來(lái)和大家分享
    2012-12-12
  • 詳解javascript設(shè)計(jì)模式三:代理模式

    詳解javascript設(shè)計(jì)模式三:代理模式

    這篇文章主要介紹了javascript設(shè)計(jì)模式三:代理模式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • javascript冒泡排序小結(jié)

    javascript冒泡排序小結(jié)

    冒泡排序由于比較簡(jiǎn)單和容易理解,往往會(huì)成為人們首先想到的排序算法。最基本的想法就是在一次里面比較兩個(gè)數(shù)字,并且確保他們?cè)谝苿?dòng)到其他項(xiàng)目之前有一個(gè)正確的順序。在每一關(guān)結(jié)束,有價(jià)值的“排序”到正確的位置,最終只留下其他項(xiàng)目排序。
    2016-04-04
  • 全面了解JavaScript的數(shù)據(jù)類(lèi)型轉(zhuǎn)換

    全面了解JavaScript的數(shù)據(jù)類(lèi)型轉(zhuǎn)換

    下面小編就為大家?guī)?lái)一篇全面了解JavaScript的數(shù)據(jù)類(lèi)型轉(zhuǎn)換。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家看,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-07-07
  • 經(jīng)常用到的JavasScript事件的翻譯

    經(jīng)常用到的JavasScript事件的翻譯

    經(jīng)常用到的JavasScript事件的翻譯...
    2007-04-04
  • window.onload和$(function(){})的區(qū)別介紹

    window.onload和$(function(){})的區(qū)別介紹

    window.onload和$(function(){})有什么區(qū)別。window.onload表示頁(yè)面加載完了后(包括dom和js),再執(zhí)行函數(shù)里面的內(nèi)容,感興趣的朋友可以了解下
    2013-10-10

最新評(píng)論