概念明确
prototype
JavaScript规定,每一个构造函数都有一个prototype属性,指向一个对象,任何函数在创建的时候,其实会默认同时创建该函数的prototype对象。
例如定义一个Star函数:
其作用就是包含可以由特定类型的所有实例共享的属性和方法,也就是让该函数所实例化的对象们都可以找到公用的属性和方法
proto
对象上都会有一个属性__proto__,该属性指向构造函数
的 prototype 原型对象
例如使用Star构造函数创建一个实例:
之所以我们对象可以使用构造函数prototype 原型对象的属性和方法,就是因为对象有 _ proto__ 原型的存在
__proto__对象原型的意义就在于为对象的查找机制提供一个方向,或者说一条路线,实例成员,可以通过_proto_对象原型属性,访问构造函数原型 prototype对象中的方法
查找规则:
- 首先先看实例对象身上是否有指定 方法,如果有就执行这个对象上的指定方法
- 如果没用指定方法,因为有_proto的存在,就会去构造函数原型对象prototype身上去查找指定方法
constructor
constructor我们称为构造函数,因为它指向构造函数本身
对象原型( _ proto__)和构造函数原型对象(prototype)里面都有一个属性constructor 属性
原型链
从上面我们可以知道:
-
当创建一个构造函数时会自动创建一个原型对象,构造函数通过prototype属性即可访问原型对象
-
prototype是原型对象,在创建构造函数时默认创建,原型对象拥有constructor属性可以指回构造函数本身
-
当构造函数通过new关键字创建实例后,对象实例可以通过__proto__属性找到构造函数的原型对象
-
原型对象也是对象,也拥有__proto__属性,原型对象的__proto__属性也指向构造函数的原型对象,正如java中所有的类都是Object类的子类一样,原型对象也是有这样的递进关系
因此,原型链就形成了: