本文正確性有待商榷,高手路過請不吝指教
1.js中只有對象,包括對象,函數,常量等。
對象不用解釋。函數也有屬性,常見之一就是prototype。常量也有屬性:
(3).__proto__;//Number {}
2.函數的prototype
函數是一種特殊的對象,它可以直接通過小括號來執行自身代碼。
函數還有一個特殊的屬性prototype,它也是一個對象。
prototype對象也有一個特殊的屬性constructor,初始的時候它是指向該函數的。
也就是當js解釋到function關鍵字的時候,會創建兩個對象,一個是function本身,一個是prototype對象。同時將該函數對象的prototype屬性指向prototype,而prototype對象的constructor屬性指向該函數對象。
3.對象的__proto__屬性
每個對象都有一個__proto__屬性(低版本的IE中可能沒有直接給出吧),該屬性十分特殊,因為在調用對象的方法或者訪問對象的屬性時,js會依次遍歷對象本身,該對象的__proto__,該對象的__proto__的__proto__……
也就是原型鏈繼承的關鍵
4.new關鍵字
new 關鍵字用於通過一個函數創建一個對象。
其實它主要完成三個工作
- 創建一個對象
- 將該對象的__proto__指向函數的prototype
- 調用該函數(此時注意函數的作用域是第一步新建的對象)
最后返回該對象即可。可以以下面的代碼代替
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,
希望大家可以共同探討,給予指點