根據以前關於原型的知識(https://segmentfault.com/a/11...),漸漸引出了原型鏈的概念。凡是對象都有原型,而在JavaScript中,萬物皆對象,因此,原型也是對象,也具備原型,也就是原型的原型,如此下去,會構成一個對象序列,該結構即爲原型鏈。如前面提到,實例對象經過 proto 訪問原型。segmentfault
那麼,原型鏈何時到頭呢?默認的原型鏈結構又是怎樣的呢?瀏覽器
凡是使用構造函數,而且沒有利用賦值方法修改原型的對象,則保留默認的原型鏈,該原型鏈經過 proto 一直向上訪問必須最終到頭,返回值 null。注意,這裏說的是原型的值爲null,須要與以前的屬性查找原則所說的沒有該屬性返回的是undefined區分開來。函數
以一個簡單的構造函數爲例,演示默認的原型鏈結構:工具
function Person(){} var p = new Person(); 當前實例對象 -> Person.prototype -> Object.prototype -> nll 能夠在Google瀏覽器調試工具中查看
經過修改(增長、刪除等)原型鏈結構,使得實例對象具備原型鏈上的全部方法prototype
上面講的是對象的原型鏈,那函數的原型鏈呢?調試
一、函數的構造函數code
在js中,使用Function能夠實例化函數對象,也就是說在js中,函數與普通對象同樣,也是一個對象類型,因此函數能夠對象
二、Function的實例代碼繼承
var foo = new Function("參數一", "參數二", "..."); Function的參數全是字符串,它是將參數鏈接起來的函數 沒有參數,表示空函數; 只有一個參數,表示函數體; 有N個參數,最後一個表示函數體,前面全部的都表示函數體的參數;
綜上,new Function 在功能上與普通函數並沒有二意。從下面的代碼,也能夠看出。ip
function foo(a, b){ var sum = a + b; return sum; } var foo = new Function("a", "b", "var sum = a + b; return sum;");
三、函數的原型鏈 任何函數都是Function的實例,因此函數能夠經過__proto__訪問到其原型(Function.prototype)。原型也是一個對象,繼承自Object.prototype。當前的原型鏈結構爲: fn -> Function.prototype -> Object.prototype -> null