js中每个对象都会在内部初始一个prototype的属性,这个属性就叫做原型。
当我们访问一个对象的属性a时,如果对象中不存在a这个属性,那么就会去prototype去找。这个portotype又有自己的portotype,直到找到某个对象的原型为null为止。这样一级一级的结构就叫做原型链。
Object: Object是一个函数对象,Object的原型就是一个Object对象,它里面存在着一些对象的方法和属性,例如最常见的toString方法。
新建对象: 用new Object或者{}建的对象是普通对象,它没有prototype属性,只有__proto__属性,它指向Object.prototype。
Array: Array也是一个函数对象,它的原型就是Array.prototype,它里面存在着一些数组的方法和属性,例如常见的push,pop等方法。
Function: Function也是一个函数对象,但它有点特殊,它的原型就是一个function空函数。
自定义函数: 它的原型就是你给它指定的那个东西。如果你不指定,那它的原型就是一个Object.prototype。
__ proto __ ,prototype, constructor的关系
instance.constructor.prototype = instance.proto
首先,我们要先理解原型的结构。
Function.portotype = {
constructor:Function,
_proto_:parent portotype,
...
}
函数的原型对象中的constructor指向函数本身。
原型对象除了有原型属性外,为了实现继承,还有一个原型链指针_proto_.这个指针指向上一层的原型对象,而上一层的结构类似,这样就利用了_proto_一直指向object的原型对象上,而object.portotype.porto=null,表示就到了原型链的最顶端。这样进形成了js的原型链继承,同时也解释了为什么所有的js对象都都有object的基本方法。
这里我们可以来看出三者的关系:
实例.__proto__ === 原型原型.constructor === 构造函数构造函数.prototype === 原型