JavaScript:面向對象與原型

1、什麼是面向對象程序員

  對象並非計算機領域憑空造出來的概念,它是順着人類思惟模式產生的一種抽象,面向對象編程也被認爲是:更接近人類思惟模式的一種編程範式。編程

  對象有以下幾個特徵:編程語言

  1. 對象具備惟一標識性:即便徹底相同的兩個對象,也並不是同一個對象。各類語言的對象惟一標識性都是用內存地址來體現的
  2. 對象有狀態:同一對象可能處於不一樣狀態之下。
  3. 對象具備行爲:對象的狀態,可能由於它的行爲產生變遷

  在JavaScript中,任何不一樣的 JavaScript 對象實際上是互不相等的。關於對象的「狀態和行爲」,JavaScript 中的行爲和狀態都能用屬性來抽象。函數

  JavaScript還有其獨有的特色:對象具備高度的動態性,這是由於 JS 賦予了使用者在運行時爲對象添改狀態和行爲的能力。性能

  JavaScript有兩種屬性:數據屬性和訪問器屬性。this

  數據屬性:prototype

  • value:就是屬性的值。
  • writable:決定屬性可否被賦值。
  • enumerable:決定 for in 可否枚舉該屬性。
  • configurable:決定該屬性可否被刪除或者改變特徵值。

  訪問器屬性:(建立對象時可使用get和set關鍵字來建立訪問器屬性)設計

  • getter:函數或 undefined,在取屬性值時被調用。
  • setter:函數或 undefined,在設置屬性值時被調用。
  • enumerable:決定 for in 可否枚舉該屬性。
  • configurable:決定該屬性可否被刪除或者改變特徵值。

2、JavaScript的原型系統對象

  在不一樣的編程語言中,設計者也利用各類不一樣的語言特性來抽象描述對象。最爲成功的流派是使用「類」的方式來描述對象,這誕生了諸如 C++、Java 等流行的編程語言。這個流派叫作基於類的編程語言。還有一種就是基於原型的編程語言,它們利用原型來描述對象,好比JavaScript。ip

  • 「基於類」的編程提倡使用一個關注分類和類之間關係開發模型。
  • 「基於原型」的編程看起來更爲提倡程序員去關注一系列對象實例的行爲,然後纔去關心如何將這些對象,而不是將它們分紅類。

  從 ES6 開始,JavaScript 提供了 class 關鍵字來定義類,這樣的方案仍然是基於原型運行時系統的模擬

  JavaScript 的原型:若是全部對象都有私有字段 [[prototype]],就是對象的原型;讀一個屬性,若是對象自己沒有,則會繼續訪問對象的原型,直到原型爲空或者找到爲止。

  

  從 ES6 以來,JavaScript 提供了一系列內置函數,以便更爲直接地訪問操縱原型。三個方法分別爲:

  • Object.create 根據指定的原型建立新對象,原型能夠是null;
  • Object.getPrototypeOf 得到一個對象的原型。
  • Object.setPrototypeOf 設置一個對象的原型。

  

  在 ES3 和以前的版本中,「類」的定義是一個私有屬性 [[class]],其訪問方式是 Object.prototype.toString。

  在 ES5 開始,[[class]] 私有屬性被 Symbol.toStringTag 代替,Object.prototype.toString 的意義從命名上再也不跟 class 相關。

  

  new 操做在建立對象的時候具體作了哪些事情:

  1. 以構造器的 prototype 屬性(注意與私有字段 [[prototype]] 的區分)爲原型,建立新對象;
  2. 將 this 和調用參數傳給構造器,執行;
  3. 若是構造器返回的是對象,則返回,不然返回第一步建立的對象。

  new 這樣的行爲,試圖讓函數對象在語法上跟類變得類似,可是,它客觀上提供了兩種方式,一是在構造器中添加屬性,二是在構造器的 prototype 屬性上添加屬性。

  ES6 中引入了 class 關鍵字,而且在標準中刪除了全部 [[class]] 相關的私有屬性描述,類的概念正式從屬性升級成語言的基礎設施,今後,基於類的編程方式成爲了 JavaScript 的官方編程範式。咱們經過 get/set 關鍵字來建立 getter,經過括號和大括號來建立方法,數據型成員最好寫在構造器裏面。

相關文章
相關標籤/搜索