前端學習筆記(2) - JavaScript面向對象

javaScript是不是面嚮對象語言?

JavaScript(es6之前)有對象的概念,卻沒有類的概念,JavaScript對象可以任意添加屬性,而java、c++等其他語言卻不能。以至於有些人認爲JavaScript並非是面向對象的語言,而是基於對象的語言。

實際上JavaScript無疑是面向對象的語言,只不多例如java、c++等語言才用的是“類”的方式來描述對象,這也是最爲成功的描述對象方式。但是javaScript採用的較爲冷的原型來描述對象的方式。但是由於某些原因JavaScript在原型運行時的基礎上加入了例如new、this等語言特性使其看起來更像java。

基於原型的面向對象

“基於類”的編程提倡使用一個關注分類和類之間關係開發模型。在這類語言中,總是先有類,再從類去實例化一個對象。類與類之間又可能會形成繼承、組合等關係。類又往往與語言的類型系統整合,形成一定編譯時的能力。

“基於原型”的編程看起來更爲提倡程序員去關注一系列對象實例的行爲,而後纔去關心如何將這些對象,劃分到最近的使用方式相似的原型對象,而不是將它們分成類。基於原型的面向對象系統通過“複製”的方式來創建新對象。一些語言的實現中,還允許複製一個空對象。這實際上就是創建一個全新的對象。JavaScript的原型對象實現方式並不是真的去複製一個對象,而是使新對象持有一個原型對象的引用。

JavaScript的原型系統其實概括起來如下:

  • 如果所有對象都有私有字段 [[prototype]],就是對象的原型;
  • 讀一個屬性,如果對象本身沒有,則會繼續訪問對象的原型,直到原型爲空或者找到爲止。

這個模型在 ES 的各個歷史版本中並沒有很大改變,但從 ES6 以來,JavaScript 提供了一系列內置函數,以便更爲直接地訪問操縱原型。三個方法分別爲:

  • Object.create 根據指定的原型創建新對象,原型可以是 null;
  • Object.getPrototypeOf 獲得一個對象的原型;
  • Object.setPrototypeOf 設置一個對象的原型。

基於類的面向對象

在es6的新語法中引入了class關鍵字,並從標準中刪除了所有與[[class]]相關的私有屬性,new與function的怪異搭配終於可以退休了。基於類的面向對象正式成爲JavaScript官方的編程範式。(JavaScript中基於類的面向對象編程實際上是基於原型面向對象編程的語法糖)

class Animal { 
  constructor(name) {
    this.name = name;
  }
  
  speak() {
    console.log(this.name + ' makes a noise.');
  }
}

class Dog extends Animal {
  constructor(name) {
    super(name); // call the super class constructor and pass in the name parameter
  }

  speak() {
    console.log(this.name + ' barks.');
  }
}

let d = new Dog('Mitzie');
d.speak(); // Mitzie barks.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章