JavaScript 原型鏈基礎詳解

  1. 在面向對象編程中,類和對象可想象爲鑄模和鑄件地關係,對象總是從類中創建。

  2. 在原型編程地思想中,類不是必須的,對象也不一定從類中創建。對象是通過克隆另一個對象得到的,如果需要一個和某對象一摸一樣的對象,就可以用原型模式

  3. Object.create可以用來克隆對象

    var Plane = function(){ 
     this.blood = 100; 
     this.attackLevel = 1; 
     this.defenseLevel = 1; 
    }; 
    var plane = new Plane(); 
    plane.blood = 500; 
    plane.attackLevel = 10; 
    plane.defenseLevel = 7; 
    var clonePlane = Object.create( plane ); 
    console.log( clonePlane ); // 輸出:Object {blood: 500, attackLevel: 10, defenseLevel: 7}
    

    在不支持 Object.create 方法的瀏覽器中,則可以使用以下代碼:

    Object.create = Object.create || function( obj ){ 
     var F = function(){}; 
     F.prototype = obj; 
     return new F(); 
    }
    
  4. 克隆是創建對象的手段

原型鏈

假設有一原型鏈 : Object=>Animal=>Dog

當我們嘗試調用Dog對象的方法,而它本身卻沒有這個方法時,那麼這個對象會把這個請求委託給它的原型Animal,並順着原型鏈委託下去,直至找到該方法或者到達根對象。

JavaScript中的原型繼承

  1. 按照 JavaScript 設計者的本意,除了 undefined 之外,一切都應是對象。爲了實現這一目標,number、boolean、string 這幾種基本類型數據也可以過“包裝類”的方式成對象類型數據來處理。

  2. js中的根對象是Object.prototype空對象。

  3. js中的函數既可以當作普通函數使用,也可以作爲構造器調用。當使用new運算符調用函數時,這個函數就是構造器

  4. 就js的真正實現,並不能說對象有原型,而只能說對象的構造器有原型,對象把請求委託給它的構造器的原型。

  5. js給對象提供了一個命爲proto隱藏對象,proto指向構造器的原型對象,{Constrctor}.prototype

  6. 手動給新建對象設置正確得 __ proto __ 指向可使用

    obj.__proto__ = Constructor.prototype
    
  7. js的對象最初都是由Object.prototype對象克隆而來,但是對象構造器的原型可以動態指向其他對象,從而達到繼承的效果。

  8. 實現一個”類“繼承另一個類的效果

    var A = function(){}
    A.prototype = {name:'sven'}
    var B = function(){}
    B.prototype = new A()
    var b = new B()
    console.log(b.name)
    
    • 嘗試遍歷b的所有屬性,沒有找到name
    • 將請求委託給b的構造器的原型,它通過b.__ proto __ 指向 B.prototype,B的原型是一個由A構造器創造出來的對象
    • 在B的原型中依然沒有找到name屬性,於是將請求委託給new A()對象的構造器原型 A.prototype
    • 在A.prototype中找到name屬性,並返回他的值
  9. 繼承總是發生在對象與對象之間

  10. Object.prototye的原型是null,當請求委託到此卻沒與找到相應屬性時,返回undefined

  11. 設計模式是對語言不足的補充

  12. 通過設置構造器原型來實現原型繼承時,初根對象Object.prototype本身外,任何對象都會有一個原型。而通過Object.create(null)可以創建出沒有原型的對象。(Object.create創建對象的效率不高)

  13. Es6的class語法,其背後仍是通過原型機制創建對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章