Javascript原型鏈和原型繼承

l371559739 7年前發布 | 14K 次閱讀 JavaScript開發 JavaScript

哇好久都沒有寫隨筆啦,整個人都慵懶啦。

為了不讓大家忘記我,把以前寫過的一些慢慢發出來。

在JS 中, 有兩條鏈子,作用域鏈 和 原型鏈.

作用域鏈相對容易理解,兩點

  • 函數限定變量作用域,就是說,在JavaScript中,在函數里面定義的變量,可以在函數里面被訪問,但是在函數外無法訪問
  • 在JavaScript中使用變量,JavaScript解釋器首先在當前作用域中搜索是否有該變量的定義,如果有,就是用這個變量;如果沒有就到父域中尋找該變量. 由于變量提升,因此在實際開發的時候,推薦將變量都寫在開始的地方,也就是在函數的開頭將變量就定義好.

好了,開始看看原型鏈吧 .

原型鏈

在我之前的一些隨筆, JavaScript使用構造函數獲取變量的類型名 涉及了一些關于 Javascript 原型的東西,這里關于原型就不啰嗦了 .

在 Javascript 中, 每一個對象 o 都具有 __proto__ 屬性(這個屬性在IE9 以下沒有暴露出來),被稱為原型 ,根據 屬性搜索原則 對象 o 可以通過 . 或者 [] 讀取原型的屬性,但是當寫入時,不會在原型上修改屬性,而是直接在對象 o 上添加.

當然,原型也是對象,原型也有 __proto__ 屬性, 子子孫孫無窮盡也 ~~~

真的是無窮盡嗎,當然不是 !

var obj = {a: 'pawn'};

上面通過對象字面值的方式申明了一個對象 obj ,并且擁有屬性 a .

由于 o.__proto__ === Object.prototype ,那么可以認為這種方式等價于

var obj = new Object({a: 10});

所以,o 是繼承自 Object.prototype ,但 Object.prototype 也是對象,它繼承自什么呢?

好吧,它繼承自 null , 萬劍歸宗。

好了,現在找到了原型鏈的第一條子鏈

我們在來看 function

var func = function() {}

通過字面值聲明一個 function

同理

func 繼承自 Function.prototype ,那 Function.prototype 也是對象,它繼承自什么呢?

可以看到, Function.prototype 繼承自 Object.prototype ,這也就回到了上一條鏈子.

好了,那現在引入一個問題, Function 本身也是函數,那 Function 繼承自哪呢? 當然是 Function.prototype ,所以JS中最亂倫的東西出現了, Function 是自己的老子,即

那 Object 也是函數, Object 也當然繼承自 Function.prototype .

好了,這就是所有原型鏈的東西

看起來好像很亂,盜 JK老師 一張圖, 詳細說明這個問題

現在做一個總結

  • 所有的函數都繼承自 Function.prototype , Function , Object 是函數,所以繼承自 Function.prototype
  • 所有的對象都直接或間接繼承自 Object.prototype , Function.prototype.__proto__ === Object.prototype 函數也是對象,所以函數最終繼承自 Object.prototype .
  • Object.prototype 繼承自 null,萬劍歸宗

原型繼承

看完了原型鏈,再看原型繼承就簡單了

var ProtoHerite = function(source) {
  var o = {};
  if(o.__proto__){
    o.__proto__ = source;
    return o;
  }

  var F = function() {};
  F.prototype = source;
  return new F();
}

這個函數返回的對象原型繼承自 source ,這也是 Object.create(source) 實現思路.

如果覺得圖畫的還可以,其實我原來是學美術的 .

如果有錯,望不吝賜教

 

來自:http://www.cnblogs.com/likeFlyingFish/p/6505324.html

 

 本文由用戶 l371559739 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!