「面试题」4、说说你对原型和原型链的理解

364 阅读2分钟

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 === 原型