__proto__是每个对象都有的属性,但是__proto__不是一个规范属性,只是部分浏览器实现了此属性,是浏览器对prototype所做的实现,对应的标准属性是prototype。
prototype是官方所定义的属性,是函数才有的属性。也就是说,官方并未定义protorype叫什么,是浏览器自己根据标准制定出来的。
大多数情况下,__proto__可以理解为“构造器的原型”,即:
___proto__ === constructor.prototype(通过Object.create()创建的对象不适用此等式)
但是!在ES6官方把[[prototype]]作为对象的内部属性,跟[[configurable]]一样,外部无法直接访问。现在已经定义了专门访问该内部属性的函数
var 对象 =new 函数()
如:var s = new String('1')
[对象.__proto__ === 函数.prototype ] 是一个经典的式子(函数指构造出这个对象的函数)
每一个对象都隐藏了一个下划线p的属性,他指向了构造他的函数
区别:__proto__是对象的属性,prototype是函数的属性。
函数.prototype.__proto__ ===Object.prototype (因为函数.prototype是对象)
函数.__proto__ === Function.prototype
Function.__proto__ ===Function.prototype
Function.prototype.__proto__ === Object.prototype
Object.__proto__ === Function.prototype
Object.prototype.__proto__指向自己。
对象有普通对象和原型对象之分,new出来的普通对象是没有原型(prototype)的,函数对象才有原型。
var 对象 = new 函数()
对象.__proto__ === 对象的构造函数.prototype
// 推论
var number = new Number()
number.__proto__ = Number.prototype
Number.__proto__ = Function.prototype // 因为 Number 是 Function 的实例
var object = new Object()
object.__proto__ = Object.prototype
Object.__proto__ = Function.prototype // 因为 Object 是 Function 的实例
var function = new Function()
function.__proto__ = Function.prototype
Function.__proto__ == Function.prototye // 因为 Function 是 Function 的实例!