在javascrpit中每一個函數中都有一個prototype屬性,在其建立的時候,不管是用var method = function(){}或者 var method = new Function()或者function method(){}三種方法中哪種方法去建立這個變量,其中都會自帶有prototype屬性。prototype屬性是一個對象,其中默認會含有constructor屬性。該屬性是指向函數自己的一個指針。java
向上面定義的method方法,若是該方法時一個構造函數,那個用該構造函數建立的新的對象:如 var m = new method();(通常構造函數首字母爲大寫以示區分,這裏忽略)。那麼該m中有一個指向原型的指針[_proto_],這個指針直接是訪問不到的,須要經過Object.getPrototypeOf()方法去訪問,亦或經過m.constructor.prototype去訪問。app
好比在method.prototype中定義一個方法,method.prototype.sayHello = function(){alert("hello");};。那麼新對象m中也能夠直接調用這個方法。m.sayHello();這時候會彈出警告框hello。每一個對象中屬性查詢的順序是先查找對象自己中有沒有該屬性,若是沒有,就會查找該對象的原型,原型的原型,直至最頂層的Object或者找到該屬性爲止,若是沒找到則會返回undefined。這裏就能夠理解上面經過m.constructor.prototype去訪問本身構造函數prototype的原理了。m自己中是沒有constructor這個構造函數指針的,因此會去查找m的[_proto_]所指向的原型中有沒有constructor。有由於m的[_proto_]是指向method.prototype,那麼確定包含constructor指針指向method自己,而prototype又是method中的屬性,因此繞幾個彎之後就能夠訪問到[_proto_]所指向的原型對象了。函數
這裏值得注意的是若是一個對象是Function類型的,那麼自己包含的prototype和[_proto_]是徹底不一樣的兩個概念。仍是按照上面舉的例子來講,關於這個method對象,若是是method.constructor,那麼指向的就是Function,若是是method.prototype.constructor ,那麼指向的就是method自己。method.constructor.prototype = Function.prototype 。因此說method.prototype.constructor和method.constructor.prototype是徹底不一樣的兩個概念,雖然只是順序不一樣。這裏Function.prototype仍是一個function類型的對象,其中咱們經常使用的arguments,call,apply,caller這些都是在這個function對象裏面所定義的。prototype