原型:我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象, 而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。
我们随意定义一个函数
function Person(){}
我们可以通过
Person.prototype
访问 **function Person()**的原型。
原型**prototype是一个指针,指向一个对象**,因此
typeof Person.prototype =="object";//true
在默认情况下,所有原型对象都会自动获得一个constructor (构造函数)属性,这个属性包含一个指向prototype 属性所在函数的指针。
代码求证:
Person.prototype.constructor==Person;//true
实例的内部将包含一个指针(内部 属性),指向构造函数的原型对象。ECMA-262 第5 版中管这个指针叫[[Prototype]]。虽然在脚本中 没有标准的方式访问[[Prototype]],但Firefox、Safari 和Chrome 在每个对象上都支持一个属性 proto;
每一个对象都有一个[[Prototype]]属性,指向实例在构造函数的原型,我们可以通过__proto__访问此属性。
p=new Person();
p.__proto__
[[Prototype]]连接存在于实例与构造函数的原型对象之间,而不是存在于实例与构造函数之间
p.__proto__==Person.prototype;//true
p.__proto__==Person.constructor;//false
每个对象都有 [[Prototype]]属性,原型也是一个对象,所以原型也有 [[Prototype]]属性,我们可以通过如下方式访问:
Person.prototype.__proto__
MDN对**Object.prototype.proto** 属性在定义为:
指向当对象被实例化的时候,用作原型的对象。
意思差不多就是原型的原型。