__proto__和prototype

197 阅读1分钟

__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 的实例!