js对象中 _proto_ 和 prototype 区别

_proto_:

所有构造器/函数的proto都指向Function.prototype,它是一个空函数(Empty function)

Number.__proto__ === Function.prototype  // true
Boolean.__proto__ === Function.prototype // true
String.__proto__ === Function.prototype  // true
Object.__proto__ === Function.prototype  // true
Function.__proto__ === Function.prototype // true
Array.__proto__ === Function.prototype   // true
RegExp.__proto__ === Function.prototype  // true
Error.__proto__ === Function.prototype   // true
Date.__proto__ === Function.prototype    // true

Function本身就是函数,Function.proto是标准的内置对象Function.prototype。

console.log(typeof Function.prototype) // function

Function.prototype.proto是标准的内置对象Object.prototype。

console.log(Function.prototype.__proto__ === Object.prototype) // true

Object.prototype是原型链的顶端,所有对象从它继承了包括toString等等方法和属性。

Object.prototype.__proto__ === null  // true
image

对象的__proto__指向自己构造函数的prototype。obj.__proto__.__proto__...的原型链由此产生,包括我们的操作符instanceof正是通过探测
obj.__proto__.__proto__... === Constructor.prototype
来验证obj是否是Constructor的实例

prototype:

只有函数才有prototype属性.

当你创建函数时,JS会为这个函数自动添加prototype属性,值是空对象。

image

Function.prototype和Function.proto都指向Function.prototype,这就是鸡和蛋的问题怎么出现的。

Object.prototype.proto === null,说明原型链到Object.prototype终止。

Object本身是构造函数,继承了Function.prototype;Function也是对象,继承了Object.prototype。这里就有一个鸡和蛋的问题:

Object instanceof Function // true
Function instanceof Object // true

参考:

proto和prototype来深入理解JS对象和原型链

JavaScript中proto与prototype的关系

注意一点,this这个值在一个继承机制中(原型链与),仍然是指向它原本属于的对象,而不是从原型链上找到它时,它所属于的对象。

你可能感兴趣的:(js对象中 _proto_ 和 prototype 区别)