读一本关于继承的书。它给出了实现继承的示例。
function Mammal() {}
Mammal.prototype = new Animal();
Mammal.prototype.constructor = Mammal;
Mammal.prototype.isPregnant = false;
Mammal.prototype.pairsOfEyes = 1;
我不明白为什么他们要做Mammal.prototype.constructor = Mammal
。
在这条线之前我们有
Mammal.prototype.constructor === Animal
对吗?那他们为什么要把它给哺乳动物?
解释如下:
在更改Mammal.prototype属性的值之后,我们将向Mammal.constructor属性分配Mammal构造函数,以便在更改prototype的值时清除对构造函数属性的副作用。
?!
那是什么意思?
这个图案对不对?
MDN教程在这个主题上也有点模糊。参见这里的例子,老师在这里扩展了人。
https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Inheritance
在我们继续前进之前,我们还需要做一件事。添加最后一行后,Teacher.prototype的构造函数属性现在等于Person(),因为我们只是将Teacher.prototype设置为引用从Person.prototype继承属性的对象!尝试保存代码,在浏览器中加载页面,并将Teacher.prototype.constructor输入控制台进行验证。这可能会成为一个问题,所以我们需要纠正这个问题。
?!
看来这一步是必要的。但是它背后的想法是什么呢?
我的意思是,谁需要这个属性(稍后),为什么不以这种方式设置它会导致问题?
发布于 2019-11-03 17:57:37
Mammal.prototype.constructor === Animal
对吗?那他们为什么要把它给哺乳动物?
对,这不是件好事。Mammal.prototype
是Mammal
实例的原型,所以您需要
new Mammal().constructor === Mammal
不
new Mammal().constructor === Animal
这就是改变的结果。
这个模式真的正确吗?
说大也大吧。这是非常过时的--懒惰(但实用)的ES3做事方式。在ES5中,您将使用Object.create(Animal.prototype)
,允许父构造函数实际操作,并相应地调用子构造函数中的父构造函数:
function Mammal() {
Animal.call(this);
}
现在,class
将为您完成所有这些以及更多的工作:
class Mammal extends Animal {}
https://stackoverflow.com/questions/58686282
复制相似问题