js的constructor和prototype

先说下这两者的关系,举例说明,

var a=[1,2,3]    ,那么a的constructor就是Array

constructor是默认指向创建当前对象的构造函数, 

但是这里面有一些坑要注意, 比如你的原型prototype被改了, 实例的constructor就变了 

Cat.prototype = new Animal();

Cat.prototype.constructor = Cat;

任何一个prototype对象都有一个constructor属性,指向它的构造函数。如果没有"Cat.prototype = new Animal();"这一行,Cat.prototype.constructor是指向Cat的;加了这一行以后,Cat.prototype.constructor指向Animal。

我们一般都知道原型是用来继承的,这样改变constructor并不会打断原型继承,那么这样修改有什么作用呢?我个人理解是要统一规范,否则原型和构造器的关系会一塌糊涂,现在人们都注重原型,而忽略构造器,确实构造器的作用是体现不出来的,但是却能体现一个清晰的逻辑。比如我们从Object开始说起,我们假设Object的原型指向一个o,那么我们创建一个实例obj1,那么obj1的构造器是Object,obj的原型是o,然后Array是由Object衍生来的,但是Array的构造器并不是Object,而是一个新的构造器继承了Object的一些属性和方法,这其中肯定改变了一次Array.prototype.constructor = Array,否则Array.prototype.constructor会是对象,那么也就使原型链不那么清晰,下面一副十分详细的原型和constructor的关系

js的constructor和prototype

所以不要改变constructor,使constructor与prototype互为逆运算,也会使结构更加清晰 ,__proto__是一个对象,包含两个属性值constructor和__proto__,所以在有很复杂的继承时,这些都不能乱

function Person(){}

let p = new Person();

console.log(p.__proto__.constructor); //function Person(){}

console.log(p.__proto__.__proto__); //对象{},拥有很多属性值

js的constructor和prototype