如何在Javascript中使用父级和子级构造函数?

时间:2014-11-24 02:27:11

标签: javascript oop

我试图理解为什么以及何时在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中正确使用构造函数的例子,以及它们何时很重要?

1 个答案:

答案 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.prototypeMammal name ###undefined

然后我们创建一个新的Cat,为Cat函数命名为Felix。此Cat函数将其name属性设置为FelixCat功能完成,felix包含Catname 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}}没有做任何事情,所以这就是无关紧要的原因。