首先我们先理解一下实例、原型、构造函数之间有什么关系,以及它们身上都有什么东西。
// 构造函数:prototype属性
// 原型:[[prototype]]、constructor
// 实例:[[prototype]]
function Parent(){}
const obj = new Parent()
这里写了简短的一个构造函数Parent,并通过它new了一个实例对象obj,而每个构造函数都有一个原型对象,通过Parent.prototype可以访问,且每个实例对象上也有一个属性__proto__指向Parent.prototype,就可以把共享的属性或方法放在原型上,实现继承。
图示如下:
注意:
1、__proto__和[[prototype]]是同一个东西,脚本中没有可访问[[prototype]]的标准方式,但可以通过__proto__去访问对象的原型
2、Person.prototype.constructor===Person,这是js默认设计的,设计初衷就是为了让constructor保留实例关联的构造函数的引用,如果修改了Person.prototype={},就会使其constructor指向了Object,要手动改回来。
3、constructor只存在于原型对象,那在实例对象中也是可以访问到的,注意是能访问,而不是在实例上