中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript中怎么實現多態與封裝

發布時間:2021-06-11 17:47:42 來源:億速云 閱讀:245 作者:Leah 欄目:web開發

JavaScript中怎么實現多態與封裝,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

1、靜態語言類型和動態語言類型

編程語言按照數據類型可以分為靜態語言類型和動態語言類型兩大類。

1) 靜態語言類型在編譯時就已經確定變量的類型

優點:在編譯時就能發現類型不匹配的錯誤,編譯器可以幫助我們提前避免程序在運行期間可能發生的一些錯誤;在程序中明確規定了數據類型,編譯器可以針對這些信息對程序進行優化工作。

缺點:迫使程序員依照契約來編寫程序,為每個變量規定數據類型;類型的聲明也會增加更多的代碼,使得程序員難以專注于業務邏輯。

2) 動態類型語言的變量類型需要到程序運行的時候變量被賦值時才能確定。

優點:編寫的代碼數量少,簡潔使得程序員可以更專注于業務邏輯。

缺點:無法保證變量的類型,在程序運行期間可能發生與類型有關的錯誤。

2、JavaScript多態

多態的思想實際上是:將"做什么"與"誰去做以及怎樣去做"分離開,也就是將"不變的事物"與"可能改變的事物"分離開,把不變的事物隔離出來,把可變的部分封裝起來。要實現這一點,歸根結底就是要消除類型之間的耦合關系。

多態的最根本的作用是:通過把程序化的條件分支語句轉化為對象的多態性,從而消除這些條件分支語句。

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()函數。

解決:把程序中相同的部分抽離出來。

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('我是醫生');
  }
};
showMe(doctor);

設計模式與多態:

絕大部分設計模式的實現都離不開多態性的思想。

3、封裝

封裝的目的是將信息隱藏。一般封裝指的是封裝數據和封裝實現,但廣義的封裝還包括封裝類型和封裝變化。

1) 封裝數據

JavaScript沒有提供private、public、protected等關鍵字來實現不同的訪問權限,只能依賴變量的作用域來實現封裝特性,而且只能模擬出private、public兩種封裝性。

除了ES6中提供的let以外,一般通過函數來創建作用域。

var obj = (function() {
  var name = "Alice"; // 模擬private變量
  return {
    getName: function() { // 模擬public方法
      return name;
    }
  }
})();
console.log(obj.name); // 輸出:undefined
console.log(obj.getName()); // 輸出:Alice

2) 封裝實現

從封裝實現細節來講,封裝使得對象內部的變化對其他對象而言是透明的,也就是不可見的,對象對自己的行為負責,其他對象或用戶不關心其內部實現。封裝使得對象之間的耦合變松散,對象之間只通過暴露的API接口來通信。修改一個對象時,可以隨意修改它的內部實現,只要對外的接口沒有變化,就不會影響程序的其他功能。

例如,迭代器的作用是在不暴露一個聚合對象的內部表示的前提下,提供一種方式來順序訪問這個聚合對象,若有一個each函數,則使用它的人不必關心其內部實現,只有它可以提供正確的功能即可,即使each函數修改了源代碼,只要對外的接口或調用方式沒有變化,用戶就不必關心其內部實現的改變。

3) 封裝類型

封裝類型是靜態類型語言的一種重要封裝方式。一般而言,封裝類型是通過抽象類和接口來進行的,將對象的類型隱藏到抽象類或接口之后,相比對象的類型,用戶更關心對象的行為。在許多靜態類型語言的設計模式中,會想方設法地隱藏對象的類型,促使工廠模式、組合模式等設計模式誕生。

在JavaScript中,并沒有對抽象類和接口的支持,在封裝類型方面,JavaScript沒有能力。

4) 封裝變化

從設計模式的角度出發,封裝更重要的層面體現為封裝變化。

通過封裝變化的方式,把系統中穩定不變的部分和容易變化的部分隔離開,在系統演變過程中,只需要替換那些容易變化的部分,若這些部分是封裝好的,替換起來就會相對容易。

看完上述內容,你們掌握JavaScript中怎么實現多態與封裝的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

铜陵市| 灵寿县| 自治县| 灵璧县| 江城| 泰顺县| 盐津县| 大庆市| 南陵县| 三台县| 广东省| 宜昌市| 长沙市| 长垣县| 英超| 中西区| 梅州市| 萨嘎县| 遂昌县| 湄潭县| 涟源市| 许昌县| 兴宁市| 东乌| 铜陵市| 四会市| 吉木乃县| 贺州市| 静宁县| 新沂市| 枞阳县| 汉寿县| 治县。| 梨树县| 黄山市| 漳浦县| 海盐县| 高邮市| 铁力市| 紫云| 海南省|