關於prototype以及__proto__的一些理解
prototype屬性只有函數對象才擁有,可以稱之為顯性屬性; __proto__每個對象都擁有包括函數對象,而這個稱之為隱性屬性。
function Lxy (){}; //一個構造函數
var b = new Lxy();// 這個時候 new做了幾個步驟。
//1. var b = {} 是個空對象(註意是個空對象!!),這也是為什麽new出來的實例沒有prototype屬性(廢話不是函數 當然沒有prototype了);
//2. b.__proto__ = Lxy.prototype 將b的原型對象指向 Lxy的原型。這也就是說 構造函數的 prototype指向可以理解為實例的原型對象指向
//3.Lxy.call(b) 讓b繼承Lxy prototype上的方法。
所以得出的結論可以理解為 : 函數的prototype指向是他的實例對象的__proto__指向。
由此可以得出 Lxy.__proto__ == Function.prototype // true 如何理解呢?Lxy作為一個函數對象自然可以當成Function(底層封裝的構造函數)的實例;
var a = 1; a.__proto__ == Number.prototype // true a作為一個數字對象自然可以看成Number(底層封裝的構造函數)的實例; 不信你可以試試Number()
var c = ‘1‘; c.__proto__ == String.prototype // true 理由同上......
然後又因為 Number,String,Object,Function等等等等都屬於底層的構造函數(個人理解。。。。。)
所以 他們都可以理解為 Function 的實例對象
所以 Object.__proto == Function.prototype; // true
Number.__proto__ == Function.prototype // true
Function.__proto__ == Function.prototype //true
最後又根據萬物皆對象。 所以 Function.prototype.__proto__ == Object.prototype // true 把Function.prototype 看做一個對象理解 他是根據Object實例出來的。(這不是打Object.__proto__ == Function.prototype 相互打臉了嗎。js是真的神奇 各種打我的臉,估計是我哪裏理解沒到位,怎麽理解?????? .....日後搞懂了來回答
那一切的源頭就是null Object.prototype.__proto__ == null 這也就是為什麽 typeof null 是object 的原因吧
關於prototype以及__proto__的一些理解