我们通过构造函数,创建了一个arr数组,在使用时会发现上面有很多定义好的方法,我们在创建时并没有定义,这些方法是哪里来的?
通过打印arr,可以看出来这些方法来自于[[prototype]]这个对象。这个对象就是原型或原型对象。
原型
显式原型(prototype)
每个函数在创建时,都会有一个prototype属性,这是一个对象,也就是显式原型。在定义函数时,可以通过this访问和添加属性。prototype作为构造函数创建的对象实例的原型。这个原型内通过constructor指回该函数。
隐式原型([[Prototype]])
当函数作为构造函数,通过new创建示例对象时。每个对象上都有[[Prototype]]指向原型对象,这就是隐式原型。
[[]]包裹的是内部属性,不能直接访问。对于
[[Prototype]],不同环境提供的访问方式不同,可以通过示例对象的__proto__访问原型
原型链
通过构造函数创建示例对象时,对象上的__proto__指向原型,原型本质也是一个对象,会通过__proto__指向它的原型。直到指向最顶层,Object.__proto__为空。这样就形成了原型链。
当访问对象上的属性时,如果不存在,就会沿着原型链,到它的原型上寻找,直到最后到空对象,报错。