JS原型和原型链

79 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第13天,点击查看活动详情

前言

构造函数与普通函数

一般规则

  构造函数都应该以 一个大写字母开头,

  而非构造函数则应该以一个小写字母开头,

调用方式

任何函数,只要通过 new 操作符来调用,那它就可以作为构造函数 ;

任何函数,如果不通过 new 操作符来调用,那它跟普通函数也没有什么两样。

每个"构造函数"中都有一个默认的属性, 叫做 prototype, prototype属性保存着一个对象, 这个对象我们称之为"原型对象", prototype 指向它的原型对象

每个"原型对象"中都有一个默认的属性, 叫做constructor, constructor 指向当前原型对象对应的那个"构造函数"

通过构造函数创建出来的对象我们称之为"实例对象", 每个"实例对象"中都有一个默认的属性, 叫做__proto__(隐式原型), proto 指向创建它的那个构造函数的"原型对象"

实例对象._ proto_ ===构造函数.prototype

js原型链.png

基本关系

  1. 所有函数都是Function构造函数的实例对象
  2. 所有函数都是对象, 包括Function构造函数
  3. 所有对象都有__proto__属性
  4. 普通对象的__proto__属性指向创建它的那个构造函数对应的"原型对象"

特殊关系

  1. 所有对象的__proto__属性最终都会指向"Object原型对象"
  2. "Object原型对象"的__proto__属性指向NULL

原型

  • 每个class都有显式原型prototype
  • 每个实例都有隐式原型__proto__
  • 实例的__proto__指向对应class的prototype

原型链

对象中__proto__组成的链条我们称之为原型链,

对象在查找属性和方法的时候, 会先在当前对象查找, 如果有就用自己的

如果当前对象中找不到想要的, 会依次去上一级原型对象中查找

如果找到Object原型对象都没有找到, 就会报错

如图,首先在Student实例对象上查找属性与方法,

若没有,则自动去隐式原型__proto__中寻找,

而其隐式原型__proto__指向其父类People隐式原型,

直到找到Object原型对象,其隐式原型__proto__指向NULL为止。

原型链.png

如类型判断instanceof判断其左边对象是否为其右边类的实例,返回boolean类型的数据,

某个变量顺着自己的隐式原型能否找到对应的显式原型,

找到则为true,否则为false

最后

本人对原型与原型链的浅显认知,仅供参考!

我是狗.gif