【前端】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]
回答
当你定义一个构造函数的时候
function Cat() {}
此时在Cat
的原型对象上会有一个constructor
属性,指向它自己(即Cat
)
Cat.prototype.constructor == Cat
当你执行以下代码时
Cat.prototype = new Animal();
你已经修改了Cat
的prototype
,此时Cat
的prototype
等于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