理解JavaScript中的封裝與繼承特性
JavaScript中的封裝
封裝簡單地說就是讓外界只能訪問對象的共有變量和函數,隱藏細節和數據。
js中有三種方法創建對象,分別爲門戶大開型、用命名規範區分私有變量、閉包創建真正的私有變量三種。
1.門戶大開型,是實現對象的最基礎的方法,所有方法與變量都是共有的外界可以訪問。
var Book = function(name){ if(k(name)){ ("error"); throw new Error("name null"); } = name; } otype = { check:function(name){ if(!name){ return true; } }, getName:function(){ return ; } } var book = new Book("哈哈"); //output:哈哈 哈哈 (,ame());
這個例子是門戶大開型的典型,外界能直接訪問對象的屬性和方法。可以注意到屬性和變量都有"this"來創建。
2.用命名規範區分私有變量,該方法是門戶大開型的優化版本,只不過是在私有變量或方法前面用"_"區分,如果有程序員有意使用_getName()的方法來調用方法,還是無法阻止的,不是真正地將變量隱藏。
3.閉包創建真正的私有變量,該方法利用js中只有函數具有作用域的特性,在構造函數的作用域中定義相關變量,這些變量可以被定義域該作用域中的所有函數訪問。
var Book2 = function(name){ if(check(name)){ ("error"); throw new Error("name null"); } name = name; function check(name){ if(!name){ return true; } } ame = function(){ return name; } } otype = { display:function(){ //無法直接訪問name return "display:"+ame(); } } var book2 = new Book2("哈哈"); //output:undefined "哈哈" "display:哈哈" (,ame(),lay());
可以看到,這個例子中的結果,直接訪問name會返回undefined的結果。可以看到這個例子與門戶大開型的'區別,門戶大開型中的變量使用"this"來創建,而這個例子中使用var來創建,check函數也是如此,使得name與check函數只能在構造函數的作用域中訪問,外界無法直接訪問。
該方法解決了前兩種方法的問題,但是也有一定的弊端。在門戶大開型對象創建模式中,所有方法都創建在原型對象中,因此不管生成多少對象實例,這些方法在內存中只存在一份,而採用該方法,每生成一個新的對象都會爲每個私有變量和方法創建一個新的副本,故會耗費更多的內存。
JavaScript中的繼承
Book基類:
var Book = function(name){ if(k(name)){ ("error"); throw new Error("name null"); } = name; } otype = { check:function(name){ if(!name){ return true; } }, getName:function(){ return ; } }
繼承方法:
function extend(subClz,superClz){ var F = function(){} otype = otype; otype = new F(); tructor = subClz; rClass = otype; if(tructor == tructor){ tructor = superClz; }
使用空函數F作爲橋接,可以避免直接實例化父類時調用父類的構造函數帶來額外開銷,而且當父類的構造函數有參數時,想直接通過otype = new superClass();實現父類構造函數的調用和原型鏈的繼承是不行的。
rClass = otype; if(tructor == tructor){ tructor = superClz; }
添加這三句可以避免子類繼承父類寫(this,name);而是簡單地寫(this,name)便能實現。
並且在子類重寫父類方法的時候,可以調用到父類的方法:
ame = functiion(){ return (this) + "!!!"; }
ArtBook子類:
var ArtBook = function(name,price){ (this,name); e = price; } extend(ArtBook,Book); rice = function(){ return e; } ame = function(){ return (this)+"!!!"; }
相關文章
-
關於JavaScript中繼承的深入理解
JavaScript中我們可以藉助原型實現繼承。例如function baz(){="";}function foo(){}otype=new baz();var myFoo=new foo();;這樣我們就可以訪問到baz裏的屬性oo啦。在實際使用中這個樣不行滴,由於原型的共享特點(數據保 -
深入理解Javascript的繼承和原型鏈
在上一篇文章中,介紹了原型的概念,瞭解到在javascript中構造函數、原型對象、實例三個好基友之間的關係:每一個構造函數都有一個“守護神”——原型對象,原型對象心裏面也存着一個構造函數的“位置”,兩情相悅,而實例呢卻又 -
java與javascript之間json格式數據互轉詳解
不喜勿噴雖然我也畫的不好T^T主要材料:畫紙勾線筆所需工具:彩鉛鉛筆橡皮製作步驟:第1步:先畫出來平行線約2.5cm第2步:鉛筆畫出眉毛,輪廓第3步:加上眼珠,留出一個小白圈爲亮光位置第4步:加細節第5步:勾線筆勾編第6步:第7步:彩鉛塗 -
明白javascript封裝
封裝可以被定義爲對對象的內部數據表現形式和實現細節進行隱藏。通過封裝可以強制實施信息隱藏。在JavaScript中,並沒有顯示的聲明私有成員的關鍵字等。所以要想實現封裝/信息隱藏就需要從另外的思路出發。我們可以使 -
關於javascript 原型鏈維護和繼承詳解
一.兩個原型很多人都知道javascript是原型繼承,每個構造函數都有一個prototype成員,通過它就可以把javascript的繼承演義的美輪美奐了.其實啊,光靠這一個屬性是無法完成javascript的繼承.我們在代碼中使用的prototype -
javascript的六種繼承方式
1.原型鏈function SuperType(){erty = true;}uperValue = function(){retu erty;};function SubType(){roperty = false;}//繼承了otype = new SuperType();ubValue = function (){retu roperty;};var instance = -
javascript中js閉包的深入理解
閉包(closure)是Javascript語言的一個難點,也是它的特色,很多高級應用都要依靠閉包實現。本文是本站小編搜索整理的關於javascript中js閉包的深入理解,給大家做個參考,希望對大家有所幫助!想了解更多相關信息請持續關注我 -
Javascript 繼承實現例子參考
1. 創建基類首先考慮Polygon類。哪些屬性和方法是必需的?首先,一定要知道多邊形的邊數,所以應該加入整數屬性sides。還有什麼是多邊形必需的?也許你想知道多邊形的面積,那麼加入計算面積的方法getArea()。圖4-3展示了 -
關於JavaScript中call()和apply() 的一些理解
作爲一名黨員,我時刻牢記自己的身份和使命。在工作中,我時刻不忘拿黨員的標準來衡量自己的一言一行,嚴格遵守公司的各項規章制度,認真學習,努力工作,積極思考。一年來,在黨組織的正確領導和精心指導下,和身邊的同事一貫堅持以 -
深入理解Javascript中的this關鍵字
文章主要介紹了深入理解Javascript中的this關鍵字,本文講解了方法調用模式、函數調用模式、構造器調用模式、apply調用模式中this的不同之處,需要的朋友可以參考下,就跟隨本站小編一起去了解下吧,想了解更多相關信息請