原型和原型链

prototype浏览器

每一个函数都有一个 prototype 属性,它实际上是个对象。函数

__ proto __prototype

在 JavaScript 中,每一个实例对象都有一个私有属性[[Prototype]],该属性指向了这个实例对象的原型,你能够经过 ES6 的 Object.getPrototypeOf() 来访问该属性,许多浏览器也对 [[Prototype]] 进行了实现,也就是咱们常常见到的 __proto__,没错,__proto__ 指向了实例对象的原型,它也是一个对象。code

constructorcdn

constructor 这个字段的内容是一个函数,函数名和构造函数居然同样。能够说,每一个原型对象都有一个 constructor 属性,指向相关联的构造函数,因此构造函数和构造函数的 prototype 是能够相互指向的。对象

小结blog

JavaScript 对象(除了 null)在建立的时候就会关联一个对象,这个对象就是原型,每个对象都会从原型上继承属性,原型也是对象,因此原型也有原型对象,层层往上,直到Object.prototype,这就是原型链。对象都会有一个 __proto__属性来访问本身的原型,同时这个原型就是生成该对象的构造函数的 prototype 属性值。每一个原型对象都有一个 constructor 属性,指向相关联的构造函数。继承

咱们知道函数都是经过 new Function() 生成的,难道 Function.prototype 也是经过 new Function() 产生的吗?答案也是否认的,这个函数也是引擎本身建立的。首先引擎建立了 Object.prototype ,而后建立了 Function.prototype ,而且经过 __proto__ 将二者联系了起来。这里也很好的解释了上面的一个问题,为何 let fun = Function.prototype.bind() 没有 prototype 属性。由于 Function.prototype 是引擎建立出来的对象,引擎认为不须要给这个对象添加 prototype 属性。ip

  • Object 是全部对象的爸爸,全部对象均可以经过 __proto__ 找到它
  • Function 是全部函数的爸爸,全部函数均可以经过 __proto__ 找到它
  • Function.prototypeObject.prototype 是两个特殊的对象,他们由引擎来建立
  • 除了以上两个特殊对象,其余对象都是经过构造器 new 出来的
  • 函数的 prototype 是一个对象,也就是原型
  • 对象的 __proto__ 指向原型, __proto__ 将对象和原型链接起来组成了原型链
相关文章
相关标签/搜索