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 的原因吧
原文:https://www.cnblogs.com/xyyyy/p/8818252.html