JS深挖(原型与原型链)

0、目录:
1)原型相关基本概念 2)原型链的概念和理解 3)构造函数new的理解

1、基本概念:
构造函数: - 可以理解为创建对象实例的模版,为了避免多个结构类似的对象的反复创建,提取重复的结构进行封装,就是构造函数;1)原型对象:(prototype ,也叫原型) - 首先它本质是对象,任何函数创建时候都会默认创建prototype; - 其次它被构造函数用来存放大家共享的属性和方法,从而实现节省空间; 2)对象原型:(__proto__ ,对象原型) - 每个对象创建时默认创建__proto__属性,指向其构造函数的原型; - 如:{}.__proto__ === Object.protorype; 3)constructor属性: - 每个原型对象默认创建的属性,指向起构造函数; - 注意:实例对象也能调用constructor,不代表其本身有这个属性,而是借用了原型;4)三者关系汇总: - 构造函数通过原型对象prototype存储共享方法; - 对象实例通过对象原型__proto__找到原型对象prototype中的方法; - 原型对象/对象原型通过constructor属性找到其构造函数,如下所示:

JS深挖(原型与原型链)
文章图片

2、原型链
定义:原型链是对象查找其内部属性/方法的链条。

  • 如上:
  • 对象实例ldh在自己身上没找到要查找的属性,就通过__proto__找到Star的原型对象;
  • 而Star的原型对象的__proto__指向的是Object的原型对象prototype;
  • 而Object的原型对象prototype的原型__proto__指向的是null。
  • 整个的查找过程就是原型链,具体是:
    dh->Star.prototype->Object.prototype->null
【JS深挖(原型与原型链)】3、构造函数new的过程发生了什么
问题:构造函数创建对象实例是通过new实现的,那么其本质是什么呢?

答:函数内部this定义的是共享属性,不用this的是私有属性 实际上它就做了三件事情:
  1. 创建一个新的对象;
  2. 新对象的proto指向构造函数的原型prototype;
  3. 将构造函数的作用域传递给实例,并执行构造函数,继而实例获得了共享的属性;
funcrion Fa () { this.name = 'fa'; }let fa1 = new Fa(); // 核心三步 let fa2 = {}; fa2.__proto__ = Fa.constructor; Fa.call(fa2);console.log(fa1.name, fa2.name);

    推荐阅读