【前端】constructor 这句有什么作用,不写也可以打印成功。

         function Animal(){

this.species = "动物";

}

function Cat(name,color){

this.name = name;

this.color = color;

}

Cat.prototype = new Animal();

Cat.prototype.constructor = Cat;

var cat1 = new Cat("大毛","黄色");

console.log(cat1.species)![图片描述][1]

【前端】constructor 这句有什么作用,不写也可以打印成功。

回答

当你定义一个构造函数的时候

function Cat() {}

此时在Cat的原型对象上会有一个constructor属性,指向它自己(即Cat

Cat.prototype.constructor == Cat

当你执行以下代码时

Cat.prototype = new Animal();

你已经修改了Catprototype,此时Catprototype等于Animal的实例,Cat的原型对象已经没有了constructor这个属性,所以需要你手动给他重新赋值Cat.prototype.constructor = Cat
当然一般情况下用不到constructor这个属性,所以你不重新指定constructor也是可以的

相当于C语言中的指针 规定指向防止混乱。

修正构造函数,不然 cat1 的构造函数指向的是 Animal,就没有继承性了

如果没有这句 Cat.prototype.constructor = Cat,cat.__proto__.constructor 会指向 Animal
,也就是 cat 的构造器函数 是 Animal,这显然不对,虽然可以正常使用,但是不符合继承逻辑。

执行完

Cat.prototype = new Animal();  

// 不指定构造函数 Cat.prototype.constructor = Cat;

接着运行

Cat.prototype.constructor   // Animal();

最后

cat1.__proto__.constructor // Animal();

这时候Cat.prototype / cat1.__proto__原型的构造函数指向了 Animal()构造函数,如果下文中使用到 Cat.prototype.constructor/cat1.__proto__.constructor 就会出现错误,本意是调用的 Cat()构造函数其实在调用 Animal()构造函数

以上是 【前端】constructor 这句有什么作用,不写也可以打印成功。 的全部内容, 来源链接: utcz.com/a/79992.html

回到顶部