我试图理解为什么以及何时在Javascript中使用构造函数。 我想知道我们何时以及如何使用孩子的构造函数以及父母的时间。基于我的测试,当我将子构造函数设置为自身或父级时没有区别。让我们看看下面的代码:
function Mammal(name) {
this.name = "###"+name;
}
Cat.prototype = new Mammal(); // Here's where the inheritance occurs
Cat.prototype.constructor = Cat; // Otherwise instances of Cat would have a
function Cat(name) {
this.name = name;
}
现在让我们实例化Cat和Mamal类并查看名称:
var mycat = new Cat('Felix');
Alert(mycat.name); //OUTPUT : "Felix"
现在我想将Cat类的构造函数设置为Mamal。为此,我删除了下面的行
//Cat.prototype.constructor = Cat; -->Now the cat Constructor is set to its default(Mamal)
现在我希望当我调用mycat.name时,它会使用Mamal构造函数并提醒“### Felix” 但它没有。它显示与之前的结果“Felix”完全相同。
var mycat = new Cat('Felix');
Alert(mycat.name); //Again OUTPUT is : "Felix" !! but I expected "###Felix"
那么,为什么?你能给我一个在Javascript中正确使用构造函数的例子,以及它们何时很重要?
答案 0 :(得分:2)
希望仔细研究这段代码的运行方式:
function Mammal(name) {
this.name = "###" + name;
}
function Cat(name) {
this.name = name;
}
Cat.prototype = new Mammal();
// omitted change of Cat.prototype.constructor
var felix = new Cat("Felix");
console.log(felix);
在定义前两个函数后,我们创建一个新的Mammal
,并将其命名为undefined
,并将结果放入Cat.prototype
。现在Cat.prototype
是Mammal
name
###undefined
。
然后我们创建一个新的Cat
,为Cat
函数命名为Felix
。此Cat
函数将其name
属性设置为Felix
。 Cat
功能完成,felix
包含Cat
个name
Felix
的对象。
那么为什么Mammal
函数没有运行呢?嗯,确实如此,但只有一次设置继承。如果您希望超类的构造函数作为子类初始化的一部分运行,则必须明确地执行此操作:
function Cat(name) {
Mammal.call(this, name);
this.name = name;
}
当然,你仍然会得到相同的结果,因为你有Mammal
函数设置name
属性,然后Cat
会再次写入它。你也可以交换它,所以Mammal
会覆盖Cat
所做的事情:
function Cat(name) {
this.name = name;
Mammal.call(this, name);
}
但Cat
this.name = name;
行constructor
没用,您也可以删除它。
那么为什么你的constructor
改变没有做任何事情?因为那不是constructor
所做的。事实上,通过阅读ES5规范,我没有看到constructor
属性实际上用于任何事情。改变{{1}}没有做任何事情,所以这就是无关紧要的原因。