js中的prototype和constructor

本文正確性有待商榷,高手路過請不吝指教

1.js中只有對象,包括對象,函數,常量等。

對象不用解釋。函數也有屬性,常見之一就是prototype。常量也有屬性:app

(3).__proto__;//Number {}

2.函數的prototype

函數是一種特殊的對象,它能夠直接經過小括號來執行自身代碼。函數

函數還有一個特殊的屬性prototype,它也是一個對象。spa

prototype對象也有一個特殊的屬性constructor,初始的時候它是指向該函數的。prototype

也就是當js解釋到function關鍵字的時候,會建立兩個對象,一個是function自己,一個是prototype對象。同時將該函數對象的prototype屬性指向prototype,而prototype對象的constructor屬性指向該函數對象。code

3.對象的__proto__屬性

每一個對象都有一個__proto__屬性(低版本的IE中可能沒有直接給出吧),該屬性十分特殊,由於在調用對象的方法或者訪問對象的屬性時,js會依次遍歷對象自己,該對象的__proto__,該對象的__proto__的__proto__……對象

也就是原型鏈繼承的關鍵blog

4.new關鍵字

new 關鍵字用於經過一個函數建立一個對象。繼承

其實它主要完成三個工做原型鏈

  1. 建立一個對象
  2. 將該對象的__proto__指向函數的prototype
  3. 調用該函數(此時注意函數的做用域是第一步新建的對象)

最後返回該對象便可。能夠如下面的代碼代替作用域

function New(f,args){var a= {};a.__proto__ = f.prototype;f.apply(a,args);return a;}

 5.js對象關係圖

其中:xFunction是自定義的函數,xPrototype是xFunction的原型,xObject=new xFunction()

Object 是JS內置的Object;_prototype_是Object的原型

Empty是全部函數對象的__proto__,是一個特殊的函數,沒有prototype,

 但願你們能夠共同探討,給予指點

相關文章
相關標籤/搜索