JavaScript多態(tài)與封裝實例分析
本文實例講述了JavaScript多態(tài)與封裝。分享給大家供大家參考,具體如下:
1、靜態(tài)語言類型和動態(tài)語言類型
編程語言按照數(shù)據(jù)類型可以分為靜態(tài)語言類型和動態(tài)語言類型兩大類。
1) 靜態(tài)語言類型在編譯時就已經(jīng)確定變量的類型
優(yōu)點:在編譯時就能發(fā)現(xiàn)類型不匹配的錯誤,編譯器可以幫助我們提前避免程序在運行期間可能發(fā)生的一些錯誤;在程序中明確規(guī)定了數(shù)據(jù)類型,編譯器可以針對這些信息對程序進行優(yōu)化工作。
缺點:迫使程序員依照契約來編寫程序,為每個變量規(guī)定數(shù)據(jù)類型;類型的聲明也會增加更多的代碼,使得程序員難以專注于業(yè)務邏輯。
2) 動態(tài)類型語言的變量類型需要到程序運行的時候變量被賦值時才能確定。
優(yōu)點:編寫的代碼數(shù)量少,簡潔使得程序員可以更專注于業(yè)務邏輯。
缺點:無法保證變量的類型,在程序運行期間可能發(fā)生與類型有關的錯誤。
2、JavaScript多態(tài)
多態(tài)的思想實際上是:將"做什么"與"誰去做以及怎樣去做"分離開,也就是將"不變的事物"與"可能改變的事物"分離開,把不變的事物隔離出來,把可變的部分封裝起來。要實現(xiàn)這一點,歸根結(jié)底就是要消除類型之間的耦合關系。
多態(tài)的最根本的作用是:通過把程序化的條件分支語句轉(zhuǎn)化為對象的多態(tài)性,從而消除這些條件分支語句。
var student = { show: function() { console.log('我是學生'); } }; 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');
問題:一旦需要增加新的type對應的show()
方法,必須改動showMe()
函數(shù)。
解決:把程序中相同的部分抽離出來。
var student = { show: function() { console.log('我是學生'); } }; var teacher = { show: function() { console.log('我是老師'); } }; var showMe = function(obj) { if (obj.show instanceof Function) obj.show(); }; showMe('teacher'); showMe('student');
若需要增加doctor
類型對象,只需增加:
var doctor = { show: function() { console.log('我是醫(yī)生'); } }; showMe(doctor);
設計模式與多態(tài):
絕大部分設計模式的實現(xiàn)都離不開多態(tài)性的思想。
3、封裝
封裝的目的是將信息隱藏。一般封裝指的是封裝數(shù)據(jù)和封裝實現(xiàn),但廣義的封裝還包括封裝類型和封裝變化。
1) 封裝數(shù)據(jù)
JavaScript沒有提供private、public、protected等關鍵字來實現(xiàn)不同的訪問權(quán)限,只能依賴變量的作用域來實現(xiàn)封裝特性,而且只能模擬出private、public兩種封裝性。
除了ES6中提供的let以外,一般通過函數(shù)來創(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) 封裝實現(xiàn)
從封裝實現(xiàn)細節(jié)來講,封裝使得對象內(nèi)部的變化對其他對象而言是透明的,也就是不可見的,對象對自己的行為負責,其他對象或用戶不關心其內(nèi)部實現(xiàn)。封裝使得對象之間的耦合變松散,對象之間只通過暴露的API接口來通信。修改一個對象時,可以隨意修改它的內(nèi)部實現(xiàn),只要對外的接口沒有變化,就不會影響程序的其他功能。
例如,迭代器的作用是在不暴露一個聚合對象的內(nèi)部表示的前提下,提供一種方式來順序訪問這個聚合對象,若有一個each
函數(shù),則使用它的人不必關心其內(nèi)部實現(xiàn),只有它可以提供正確的功能即可,即使each
函數(shù)修改了源代碼,只要對外的接口或調(diào)用方式?jīng)]有變化,用戶就不必關心其內(nèi)部實現(xiàn)的改變。
3) 封裝類型
封裝類型是靜態(tài)類型語言的一種重要封裝方式。一般而言,封裝類型是通過抽象類和接口來進行的,將對象的類型隱藏到抽象類或接口之后,相比對象的類型,用戶更關心對象的行為。在許多靜態(tài)類型語言的設計模式中,會想方設法地隱藏對象的類型,促使工廠模式、組合模式等設計模式誕生。
在JavaScript中,并沒有對抽象類和接口的支持,在封裝類型方面,JavaScript沒有能力。
4) 封裝變化
從設計模式的角度出發(fā),封裝更重要的層面體現(xiàn)為封裝變化。
通過封裝變化的方式,把系統(tǒng)中穩(wěn)定不變的部分和容易變化的部分隔離開,在系統(tǒng)演變過程中,只需要替換那些容易變化的部分,若這些部分是封裝好的,替換起來就會相對容易。
更多關于JavaScript相關內(nèi)容可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript切換特效與技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》、《JavaScript錯誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學運算用法總結(jié)》
希望本文所述對大家JavaScript程序設計有所幫助。
相關文章
jquery實現(xiàn)瀑布流效果 jquery下拉加載新數(shù)據(jù)
這篇文章主要為大家詳細介紹了jquery實現(xiàn)瀑布流效果,下拉加載新數(shù)據(jù),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-12-12JS實現(xiàn)鼠標點擊箭頭旋轉(zhuǎn)180度功能
這篇文章主要介紹了JS實現(xiàn)鼠標點擊箭頭旋轉(zhuǎn)180度的效果,通過點擊三角按鈕旋轉(zhuǎn)180度,本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧2024-02-02js基于面向?qū)ο髮崿F(xiàn)網(wǎng)頁TAB選項卡菜單效果代碼
這篇文章主要介紹了js基于面向?qū)ο髮崿F(xiàn)網(wǎng)頁TAB選項卡菜單效果代碼,實例演示了鼠標滑過即點擊兩種方式實現(xiàn)tab選項卡切換功能,涉及JavaScript鼠標事件控制頁面元素屬性變換的功能,需要的朋友可以參考下2015-09-09js實現(xiàn)Select列表內(nèi)容自動滾動效果代碼
這篇文章主要介紹了js實現(xiàn)Select列表內(nèi)容自動滾動效果的方法,涉及javascript簡單遞歸調(diào)用遍歷select及時間函數(shù)的相關使用技巧,需要的朋友可以參考下2015-08-08js+數(shù)組實現(xiàn)網(wǎng)頁上顯示時間/星期幾的實用方法
在網(wǎng)頁上顯示時間(年月日/時分秒),很多新手朋友都想實現(xiàn)這樣的功能,本文整理了一些實用技巧,殺出來與大家分享,感興趣的朋友可以了解下2013-01-01