Javascript原型模式總結梳理

來源:互聯網
上載者:User

標籤:

  在大多數物件導向語言中,對象總是由類中執行個體化而來,類和對象的關係就像模具跟模件一樣。Javascript中沒有類的概念,就算ES6中引入的class也不過是一種文法糖,本質上還是利用原型實現。在原型程式設計語言中,類並不是必需的,對象不一定需要由類執行個體化而來,而是通過複製另外一個對象來得到。

  原型模式是用來建立對象的一種模式。在以類為中心的語言中,要建立一個對象首先要指定這個對象的類型,然後執行個體化一個對象。使用原型模式建立對象時不必關心對象的具體類型,而是找到一個對象,然後通過複製來建立一個一模一樣的對象。所以在前者中如果要根據一個對象建立多個相同的對象,我們需要先儲存這個對象的所有屬性資訊,然後將屬性資訊設定到新建立的對象上,而在原型模式中我們只需要使用複製就能完成同樣的功能。

  在某些玄幻小說中經常會出現某些修真大能,以分身的形式遊走世間。這個過程很適合原型模式的應用:

function Master(){    this.blood = 100;    this.level = 6;}var noumenon = new Master();noumenon.level = 9;var ektype = Object.create(noumenon);console.log(ektype);

  ES5提供了原生的複製方法:Object.create,不支援這個方法的瀏覽器可以使用如下代碼:

function clone(obj){    function F(){};    F.prototype = obj;    return new F();}var ektype = clone(noumenon);

  通過以上代碼,我們看到了如何通過原型模式來複製出一個一模一樣的的對象。原型模式的真正意義並非建立一個一模一樣的對象,而是提供一種建立對象的方式,Javascript的物件導向機制是基於原型模式的,他的對象系統就是使用原型模式,通過複製來建立的,複製是建立一個對象的過程和手段。以繼承為例:

function Person(name){    this.name = name;}function Developer(lang){    this.language = lang;}var p = new Person(‘coder‘);Developer.prototype = p;var dev = new Developer(‘Javascript‘);

 

  基於原型的繼承體系,子類的每次執行個體化都是對其建構函式的prototype屬性的複製。所以每次建立Developer對象,其實都是在對p對象的複製。

  在Java等以類為中心的物件導向語言中,經常使用new執行個體化一個對象。但是Javascript是基於原型的物件導向語言,在這裡new運算子建立對象的方式與Java中的new運算子並不相同,Javascript中的new運算子也是通過複製來執行個體化對象的,複製的是構造器函數的原型對象,new運算子的作用等同於如下代碼:

function Person(name){    this.name = name;}function Developer(lang){    this.language = lang;}var p = new Person(‘coder‘);Developer.prototype = p;function _new(_Constructor) {    var that = Object.create(_Constructor.prototype);    var args = Array.prototype.slice.call(arguments, 1);    var other = _Constructor.apply(that, args);        return (typeof other === ‘object‘ && other) ? other : that;}_new(Developer, ‘JavaScript‘)

  從這我們也可以看出,Javascript的原型實際上存在著諸多矛盾,它的某些複雜文法看起來就像那些基於類的語言,這掩蓋了它的原型機制。所以jQuery中盡量避免使用new運算子來建立對象。

  根據前面所說Javascript中新建立的對象都是基於原有對象的複製,所以在Javascript中存在一個最原始的對象:Object.prototype,所有對象都是由它複製而來。

 

  這裡所說的複製是在Javascript原型模式這一大環境下的一種語義表達,在電腦的物理世界中並不存在真正的複製。所以這裡對於複製應當理解為產生一個擁有__proto__屬性指向原對象的對象的過程,原對象成為被複製的對象,也就是建構函式的prototype對象。

 

  擁有以上共識後,我們可以得到在Javascript中原型編程的基本規則:

  1. Javascript中絕大多數資料都是對象
  2. 要得到一個對象,不是通過執行個體化類,而是找到一個對象作為原型並複製它
  3. 對象會記住它的原型
  4. 如果對象無法響應某個請求,他會把這個請求委託給它自己的原型

 

參考書籍:

《Javascript語言精粹》

《Javascript設計模式與開發實踐》

Javascript原型模式總結梳理

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.