簡單理解JavaScript中的封裝與繼承特性
JavaScript中的封裝
封裝簡單地說就是讓外界只能訪問對(duì)象的共有變量和函數(shù),隱藏細(xì)節(jié)和數(shù)據(jù)。
js中有三種方法創(chuàng)建對(duì)象,分別為門戶大開型、用命名規(guī)范區(qū)分私有變量、閉包創(chuàng)建真正的私有變量三種。
1.門戶大開型,是實(shí)現(xiàn)對(duì)象的最基礎(chǔ)的方法,所有方法與變量都是共有的外界可以訪問。
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è)例子是門戶大開型的典型,外界能直接訪問對(duì)象的屬性和方法??梢宰⒁獾綄傩院妥兞慷加?this"來創(chuàng)建。
2.用命名規(guī)范區(qū)分私有變量,該方法是門戶大開型的優(yōu)化版本,只不過是在私有變量或方法前面用"_"區(qū)分,如果有程序員有意使用_getName()的方法來調(diào)用方法,還是無法阻止的,不是真正地將變量隱藏。
3.閉包創(chuàng)建真正的私有變量,該方法利用js中只有函數(shù)具有作用域的特性,在構(gòu)造函數(shù)的作用域中定義相關(guān)變量,這些變量可以被定義域該作用域中的所有函數(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());
可以看到,這個(gè)例子中的結(jié)果,直接訪問name會(huì)返回undefined的結(jié)果??梢钥吹竭@個(gè)例子與門戶大開型的區(qū)別,門戶大開型中的變量使用"this"來創(chuàng)建,而這個(gè)例子中使用var來創(chuàng)建,check函數(shù)也是如此,使得name與check函數(shù)只能在構(gòu)造函數(shù)的作用域中訪問,外界無法直接訪問。
該方法解決了前兩種方法的問題,但是也有一定的弊端。在門戶大開型對(duì)象創(chuàng)建模式中,所有方法都創(chuàng)建在原型對(duì)象中,因此不管生成多少對(duì)象實(shí)例,這些方法在內(nèi)存中只存在一份,而采用該方法,每生成一個(gè)新的對(duì)象都會(huì)為每個(gè)私有變量和方法創(chuàng)建一個(gè)新的副本,故會(huì)耗費(fèi)更多的內(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í)調(diào)用父類的構(gòu)造函數(shù)帶來額外開銷,而且當(dāng)父類的構(gòu)造函數(shù)有參數(shù)時(shí),想直接通過subClass.prototype = new superClass();實(shí)現(xiàn)父類構(gòu)造函數(shù)的調(diào)用和原型鏈的繼承是不行的。
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)便能實(shí)現(xiàn)。
并且在子類重寫父類方法的時(shí)候,可以調(diào)用到父類的方法:
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基于對(duì)象三大特性(封裝性、繼承性、多態(tài)性)
- js中實(shí)現(xiàn)多態(tài)采用和繼承類似的方法
- javascript 面向?qū)ο笕吕砭氈^承與多態(tài)
- JavaScript多態(tài)與封裝實(shí)例分析
- javascript的函數(shù)、創(chuàng)建對(duì)象、封裝、屬性和方法、繼承
- JavaScript的模塊化:封裝(閉包),繼承(原型) 介紹
- javascript 面向?qū)ο蠓庋b與繼承
- js封裝可使用的構(gòu)造函數(shù)繼承用法分析
- Javascript學(xué)習(xí)筆記9 prototype封裝繼承
- JavaScript的繼承的封裝介紹
- JavaScript實(shí)現(xiàn)多態(tài)和繼承的封裝操作示例
相關(guān)文章
javascript 觸發(fā)事件列表 比較不錯(cuò)
javascript 觸發(fā)事件列表,整理的一些js的事件,一般常用的就是onclick,onmouseover等。大家可以了解下,方便以后應(yīng)用。2009-09-09
js中top/parent/frame概述及案例應(yīng)用
top:永遠(yuǎn)指分割窗口最高層次的瀏覽器窗口;parent:包含當(dāng)前分割窗口的父窗口,本文將圍繞js中top、parent、frame進(jìn)行講述及他們的應(yīng)用案例2013-02-02
JavaScript正則表達(dá)式中的ignoreCase屬性使用詳解
這篇文章主要介紹了JavaScript正則表達(dá)式中的ignoreCase屬性使用詳解,是JS學(xué)習(xí)進(jìn)階中的重要知識(shí)點(diǎn),需要的朋友可以參考下2015-06-06
表單的焦點(diǎn)順序tabindex和對(duì)應(yīng)enter鍵提交
表單的焦點(diǎn)tab鍵順序:tabindex決定,如果值缺省,擇按順序一一對(duì)應(yīng),想詳細(xì)了解此功能應(yīng)用的朋友可以參考下2013-01-01
JavaScript中Boolean對(duì)象的屬性解析
這篇文章主要介紹了JavaScript中布爾對(duì)象的屬性解析,包括對(duì)constructor屬性和prototype構(gòu)造器的簡單介紹,需要的朋友可以參考下2015-10-10
caller和callee的區(qū)別介紹及演示結(jié)果
caller返回一個(gè)函數(shù)的引用,這個(gè)函數(shù)調(diào)用了當(dāng)前的函數(shù);callee放回正在執(zhí)行的函數(shù)本身的引用,它是arguments的一個(gè)屬性,感興趣的你可以參考下或許可以幫助到你2013-03-03

