基本概念

1. 原型

每个函数都会自动附带一个属性prototype,这个属性的值是一个普通对象,称之为原型对象

2. 实例

instance,通过new产生的对象称之为实例。

由于JS中所有对象都是通过new产生的,因此,严格来说,JS中所有对象都称之为实例

3. 隐式原型

每个实例都拥有一个特殊的属性__proto__,称之为隐式原型,它指向构造函数的原型

当访问实例成员时,先找自身,如果不存在,会自动从隐式原型中寻找,这样可以把那些公共成员,放到函数的原型中,即可被所有实例共享

this指向

在不同场景下,this指代的含义不同:

  1. 在全局代码中使用this,指代全局对象
  2. 在函数中使用this,它的指向完全取决于函数是如何被调用的

    调用方式示例函数中的this指向
    通过new调用new method()新对象
    直接调用method()全局对象
    通过对象调用obj.method()前面的对象
    callmethod.call(ctx)call的第一个参数
    applymethod.apply(ctx)apply的第一个参数

原型链

所有的对象本质上都是通过new 函数的方式创建的

原型对象本身也是一个对象,默认情况下,是通过new Object创建的,因此,上面的两幅原型图是可以发生关联的

Object.prototype.__proto__比较特殊,它固定指向null

u1的隐式原型形成了一个链条,称之为原型链,当读取对象成员时,会先看对象自身是否有该成员,如果没有,就依次在其==原型链==上查找

完整的链条

创建空原型的对象

  1. 利用Object.create()

    Object.create(target);
    // 返回一个新对象,新对象以target作为隐式原型
  2. 利用Object.setPrototypeOf()

    Object.setPrototypeOf(obj, prototype);
    // 设置obj的隐式原型为prototype