JavaScript多態(tài)與封裝實(shí)例分析
本文實(shí)例講述了JavaScript多態(tài)與封裝。分享給大家供大家參考,具體如下:
1、靜態(tài)語(yǔ)言類(lèi)型和動(dòng)態(tài)語(yǔ)言類(lèi)型
編程語(yǔ)言按照數(shù)據(jù)類(lèi)型可以分為靜態(tài)語(yǔ)言類(lèi)型和動(dòng)態(tài)語(yǔ)言類(lèi)型兩大類(lèi)。
1) 靜態(tài)語(yǔ)言類(lèi)型在編譯時(shí)就已經(jīng)確定變量的類(lèi)型
優(yōu)點(diǎn):在編譯時(shí)就能發(fā)現(xiàn)類(lèi)型不匹配的錯(cuò)誤,編譯器可以幫助我們提前避免程序在運(yùn)行期間可能發(fā)生的一些錯(cuò)誤;在程序中明確規(guī)定了數(shù)據(jù)類(lèi)型,編譯器可以針對(duì)這些信息對(duì)程序進(jìn)行優(yōu)化工作。
缺點(diǎn):迫使程序員依照契約來(lái)編寫(xiě)程序,為每個(gè)變量規(guī)定數(shù)據(jù)類(lèi)型;類(lèi)型的聲明也會(huì)增加更多的代碼,使得程序員難以專(zhuān)注于業(yè)務(wù)邏輯。
2) 動(dòng)態(tài)類(lèi)型語(yǔ)言的變量類(lèi)型需要到程序運(yùn)行的時(shí)候變量被賦值時(shí)才能確定。
優(yōu)點(diǎn):編寫(xiě)的代碼數(shù)量少,簡(jiǎn)潔使得程序員可以更專(zhuān)注于業(yè)務(wù)邏輯。
缺點(diǎn):無(wú)法保證變量的類(lèi)型,在程序運(yùn)行期間可能發(fā)生與類(lèi)型有關(guān)的錯(cuò)誤。
2、JavaScript多態(tài)
多態(tài)的思想實(shí)際上是:將"做什么"與"誰(shuí)去做以及怎樣去做"分離開(kāi),也就是將"不變的事物"與"可能改變的事物"分離開(kāi),把不變的事物隔離出來(lái),把可變的部分封裝起來(lái)。要實(shí)現(xiàn)這一點(diǎn),歸根結(jié)底就是要消除類(lèi)型之間的耦合關(guān)系。
多態(tài)的最根本的作用是:通過(guò)把程序化的條件分支語(yǔ)句轉(zhuǎn)化為對(duì)象的多態(tài)性,從而消除這些條件分支語(yǔ)句。
var student = {
show: function() {
console.log('我是學(xué)生');
}
};
var teacher = {
show: function() {
console.log('我是老師');
}
};
var showMe = function(type) {
if (type == 'teacher')
teacher.show();
else if (type == 'student')
teacher.show();
};
showMe('teacher');
showMe('student');
問(wèn)題:一旦需要增加新的type對(duì)應(yīng)的show()方法,必須改動(dòng)showMe()函數(shù)。
解決:把程序中相同的部分抽離出來(lái)。
var student = {
show: function() {
console.log('我是學(xué)生');
}
};
var teacher = {
show: function() {
console.log('我是老師');
}
};
var showMe = function(obj) {
if (obj.show instanceof Function)
obj.show();
};
showMe('teacher');
showMe('student');
若需要增加doctor類(lèi)型對(duì)象,只需增加:
var doctor = {
show: function() {
console.log('我是醫(yī)生');
}
};
showMe(doctor);
設(shè)計(jì)模式與多態(tài):
絕大部分設(shè)計(jì)模式的實(shí)現(xiàn)都離不開(kāi)多態(tài)性的思想。
3、封裝
封裝的目的是將信息隱藏。一般封裝指的是封裝數(shù)據(jù)和封裝實(shí)現(xiàn),但廣義的封裝還包括封裝類(lèi)型和封裝變化。
1) 封裝數(shù)據(jù)
JavaScript沒(méi)有提供private、public、protected等關(guān)鍵字來(lái)實(shí)現(xiàn)不同的訪(fǎng)問(wèn)權(quán)限,只能依賴(lài)變量的作用域來(lái)實(shí)現(xiàn)封裝特性,而且只能模擬出private、public兩種封裝性。
除了ES6中提供的let以外,一般通過(guò)函數(shù)來(lái)創(chuàng)建作用域。
var obj = (function() {
var name = "Alice"; // 模擬private變量
return {
getName: function() { // 模擬public方法
return name;
}
}
})();
console.log(obj.name); // 輸出:undefined
console.log(obj.getName()); // 輸出:Alice
2) 封裝實(shí)現(xiàn)
從封裝實(shí)現(xiàn)細(xì)節(jié)來(lái)講,封裝使得對(duì)象內(nèi)部的變化對(duì)其他對(duì)象而言是透明的,也就是不可見(jiàn)的,對(duì)象對(duì)自己的行為負(fù)責(zé),其他對(duì)象或用戶(hù)不關(guān)心其內(nèi)部實(shí)現(xiàn)。封裝使得對(duì)象之間的耦合變松散,對(duì)象之間只通過(guò)暴露的API接口來(lái)通信。修改一個(gè)對(duì)象時(shí),可以隨意修改它的內(nèi)部實(shí)現(xiàn),只要對(duì)外的接口沒(méi)有變化,就不會(huì)影響程序的其他功能。
例如,迭代器的作用是在不暴露一個(gè)聚合對(duì)象的內(nèi)部表示的前提下,提供一種方式來(lái)順序訪(fǎng)問(wèn)這個(gè)聚合對(duì)象,若有一個(gè)each函數(shù),則使用它的人不必關(guān)心其內(nèi)部實(shí)現(xiàn),只有它可以提供正確的功能即可,即使each函數(shù)修改了源代碼,只要對(duì)外的接口或調(diào)用方式?jīng)]有變化,用戶(hù)就不必關(guān)心其內(nèi)部實(shí)現(xiàn)的改變。
3) 封裝類(lèi)型
封裝類(lèi)型是靜態(tài)類(lèi)型語(yǔ)言的一種重要封裝方式。一般而言,封裝類(lèi)型是通過(guò)抽象類(lèi)和接口來(lái)進(jìn)行的,將對(duì)象的類(lèi)型隱藏到抽象類(lèi)或接口之后,相比對(duì)象的類(lèi)型,用戶(hù)更關(guān)心對(duì)象的行為。在許多靜態(tài)類(lèi)型語(yǔ)言的設(shè)計(jì)模式中,會(huì)想方設(shè)法地隱藏對(duì)象的類(lèi)型,促使工廠(chǎng)模式、組合模式等設(shè)計(jì)模式誕生。
在JavaScript中,并沒(méi)有對(duì)抽象類(lèi)和接口的支持,在封裝類(lèi)型方面,JavaScript沒(méi)有能力。
4) 封裝變化
從設(shè)計(jì)模式的角度出發(fā),封裝更重要的層面體現(xiàn)為封裝變化。
通過(guò)封裝變化的方式,把系統(tǒng)中穩(wěn)定不變的部分和容易變化的部分隔離開(kāi),在系統(tǒng)演變過(guò)程中,只需要替換那些容易變化的部分,若這些部分是封裝好的,替換起來(lái)就會(huì)相對(duì)容易。
更多關(guān)于JavaScript相關(guān)內(nèi)容可查看本站專(zhuān)題:《javascript面向?qū)ο笕腴T(mén)教程》、《JavaScript切換特效與技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
相關(guān)文章
兼容FireFox 用javascript寫(xiě)的一個(gè)畫(huà)圖函數(shù)
兼容FireFox 用javascript寫(xiě)的一個(gè)畫(huà)圖函數(shù)...2007-08-08
JS實(shí)現(xiàn)json數(shù)組排序操作實(shí)例分析
這篇文章主要介紹了JS實(shí)現(xiàn)json數(shù)組排序操作,結(jié)合實(shí)例形式分析了javascript針對(duì)json數(shù)組的遍歷、排序簡(jiǎn)單操作技巧,需要的朋友可以參考下2019-10-10
Javascript 浮點(diǎn)運(yùn)算的問(wèn)題分析與解決方法
JavaScript 只有一種數(shù)字類(lèi)型 Number ,而且在Javascript中所有的數(shù)字都是以IEEE-754標(biāo)準(zhǔn)格式表示的。 浮點(diǎn)數(shù)的精度問(wèn)題不是JavaScript特有的,因?yàn)橛行┬?shù)以二進(jìn)制表示位數(shù)是無(wú)窮的2013-08-08
js中的bigint類(lèi)型轉(zhuǎn)化為json字符串時(shí)報(bào)無(wú)法序列化的問(wèn)題
JSON序列化指將JSON對(duì)象轉(zhuǎn)換為JSON字符串,J實(shí)現(xiàn)方式有兩種:一種是調(diào)用JSON對(duì)象內(nèi)置的stringify()函數(shù),一種是為對(duì)象自定義toJSON()函數(shù),本文重點(diǎn)介紹js中的bigint類(lèi)型轉(zhuǎn)化為json字符串時(shí)報(bào)無(wú)法序列化的問(wèn)題,感興趣的朋友一起看看吧2024-01-01
JS+DIV實(shí)現(xiàn)鼠標(biāo)劃過(guò)切換層效果的方法
這篇文章主要介紹了JS+DIV實(shí)現(xiàn)鼠標(biāo)劃過(guò)切換層效果的方法,涉及javascript鼠標(biāo)事件及頁(yè)面元素操作的相關(guān)技巧,需要的朋友可以參考下2015-05-05
JS案例分享之金額小寫(xiě)轉(zhuǎn)大寫(xiě)
這篇文章主要介紹了JS金額小寫(xiě)轉(zhuǎn)大寫(xiě)的方法,需要的朋友可以參考下2014-05-05
javascript使用正則表達(dá)式實(shí)現(xiàn)注冊(cè)登入校驗(yàn)
這篇文章主要為大家詳細(xì)介紹了javascript使用正則表達(dá)式實(shí)現(xiàn)注冊(cè)登入校驗(yàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09
JavaScript實(shí)現(xiàn)給浮點(diǎn)數(shù)添加千分位逗號(hào)的多種方法
JavaScript 是一門(mén)強(qiáng)大的前端語(yǔ)言,在處理數(shù)值格式化時(shí)提供了多種方法,在開(kāi)發(fā)過(guò)程中,我們經(jīng)常需要將大數(shù)字格式化,使其更具可讀性,例如,將 12000000.11 轉(zhuǎn)換為 12,000,000.11,本文將詳細(xì)介紹 JavaScript 中如何實(shí)現(xiàn)這種格式化,需要的朋友可以參考下2025-04-04

