javascript 中關於function中的prototype


  在javascrpit中每個函數中都有一個prototype屬性,在其創建的時候,無論是用var method = function(){}或者 var method = new Function()或者function method(){}三種方法中哪一種方法去創建這個變量,其中都會自帶有prototype屬性。prototype屬性是一個對象,其中默認會含有constructor屬性。該屬性是指向函數本身的一個指針。

  向上面定義的method方法,如果該方法時一個構造函數,那個用該構造函數創建的新的對象:如 var m = new method();(一般構造函數首字母為大寫以示區分,這里忽略)。那么該m中有一個指向原型的指針[_proto_],這個指針直接是訪問不到的,需要通過Object.getPrototypeOf()方法去訪問,亦或通過m.constructor.prototype去訪問。

  比如在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對象里面所定義的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM