基本概念
1. 原型
每个函数都会自动附带一个属性prototype
,这个属性的值是一个普通对象,称之为原型对象
2. 实例
instance,通过new
产生的对象称之为实例。
由于JS中所有对象都是通过new
产生的,因此,严格来说,JS中所有对象都称之为实例
3. 隐式原型
每个实例都拥有一个特殊的属性__proto__
,称之为隐式原型,它指向构造函数的原型
当访问实例成员时,先找自身,如果不存在,会自动从隐式原型中寻找,这样可以把那些公共成员,放到函数的原型中,即可被所有实例共享
this
指向
在不同场景下,this
指代的含义不同:
- 在全局代码中使用this,指代全局对象
在函数中使用this,它的指向完全取决于函数是如何被调用的
调用方式 示例 函数中的this指向 通过new调用 new method()
新对象 直接调用 method()
全局对象 通过对象调用 obj.method()
前面的对象 call method.call(ctx)
call的第一个参数 apply method.apply(ctx)
apply的第一个参数
原型链
所有的对象本质上都是通过new 函数
的方式创建的
原型对象本身也是一个对象,默认情况下,是通过new Object
创建的,因此,上面的两幅原型图是可以发生关联的
Object.prototype.__proto__
比较特殊,它固定指向null
u1的隐式原型形成了一个链条,称之为原型链,当读取对象成员时,会先看对象自身是否有该成员,如果没有,就依次在其==原型链==上查找
完整的链条
创建空原型的对象
利用
Object.create()
Object.create(target); // 返回一个新对象,新对象以target作为隐式原型
利用
Object.setPrototypeOf()
Object.setPrototypeOf(obj, prototype); // 设置obj的隐式原型为prototype