由于这是我第一次写文章,有不足之处还请大家指正。
首先我们从js类型出发。js基本类型比较特殊,例如string和numebr等都可以采用new构造函数的形式构建(这样出来的类型是object)。
我们使用typeof对几个基本类型的构造函数进行求类型:
//function
console.log(typeof Boolean);
//object,是历史错误,表示空对象
console.log(typeof null);
//undefined
console.log(typeof undefined);
//function
console.log(typeof BigInt);
//function
console.log(typeof Object);
//function
console.log(typeof Array);
//function
console.log(typeof Function);
我们可以看出,除了null和undefined比较特殊之外,其他类型的typeof值都是function。这也就意味着这些类型的构造函数都是由Function来构建的。 也就是:Object.proto==Function.prototype -------1
而由于Function.prototype是个对象类型,所以它又是由Object来构建的。 也就是:Function.prototype.proto==Object.prototype --------2
将1,2式关联起来就能得到:Object.proto.proto==Object.prototype
其实我们可以换个角度来看问题
我的理解是当求xxx.__proto__时,就从实例对象的角度来看,也就是xxx是哪个构造函数的实例对象。例如Object既是普通对象的构造函数也是Function构造函数的实例对象,当求解Object.__proto__时就将它从Function构造函数实例对象的角度来看,就能得到Object.proto==Function.prototype
如果当求xxx.prototype时,就从构造函数的角度来看。比如String,它是字符串的构造函数,b=new String(‘ok’)这是个由他构造出来的字符串对象。b.__proto__自然指向String.prototype,而由于原型对象是一个对象,它是由Object实例化的对象,所以String.prototype.proto==Object.prototype