携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第13天,点击查看活动详情
前言
构造函数与普通函数
一般规则
构造函数都应该以 一个大写字母开头,
而非构造函数则应该以一个小写字母开头,
调用方式
任何函数,只要通过 new
操作符来调用,那它就可以作为构造函数 ;
任何函数,如果不通过 new
操作符来调用,那它跟普通函数也没有什么两样。
每个"构造函数"中都有一个默认的属性, 叫做 prototype
, prototype
属性保存着一个对象, 这个对象我们称之为"原型对象", prototype
指向它的原型对象
每个"原型对象"中都有一个默认的属性, 叫做constructor
, constructor
指向当前原型对象对应的那个"构造函数"
通过构造函数创建出来的对象我们称之为"实例对象", 每个"实例对象"中都有一个默认的属性, 叫做__proto__
(隐式原型), proto 指向创建它的那个构造函数的"原型对象"
实例对象._ proto_ ===构造函数.prototype
基本关系
- 所有函数都是Function构造函数的实例对象
- 所有函数都是对象, 包括Function构造函数
- 所有对象都有
__proto__
属性 - 普通对象的
__proto__
属性指向创建它的那个构造函数对应的"原型对象"
特殊关系
- 所有对象的
__proto__
属性最终都会指向"Object
原型对象" - "Object原型对象"的
__proto__
属性指向NULL
原型
- 每个class都有显式原型
prototype
- 每个实例都有隐式原型
__proto__
- 实例的
__proto__
指向对应class的prototype
原型链
对象中__proto__组成的链条我们称之为原型链,
对象在查找属性和方法的时候, 会先在当前对象查找, 如果有就用自己的
如果当前对象中找不到想要的, 会依次去上一级原型对象中查找
如果找到Object原型对象都没有找到, 就会报错
如图,首先在Student
实例对象上查找属性与方法,
若没有,则自动去隐式原型__proto__
中寻找,
而其隐式原型__proto__
指向其父类People
隐式原型,
直到找到Object原型对象,其隐式原型__proto__指向NULL为止。
如类型判断instanceof
判断其左边对象是否为其右边类的实例,返回boolean
类型的数据,
某个变量顺着自己的隐式原型能否找到对应的显式原型,
找到则为true
,否则为false
。
最后
本人对原型与原型链的浅显认知,仅供参考!