gpt4 book ai didi

javascript - 如何在 Javascript 中使用父子构造函数?

转载 作者:行者123 更新时间:2023-11-30 17:10:35 26 4
gpt4 key购买 nike

我试图理解我们为什么以及何时在 Javascript 中使用构造函数。我想知道我们何时以及如何需要使用 child 的构造函数以及何时使用 parent 。根据我的测试,当我将子构造函数设置为自身或父构造函数时没有区别。让我们看一下下面的代码:

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 中正确使用构造函数以及它们何时重要?

最佳答案

希望通过检查这段代码的运行方式可以弄清问题:

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 是一个 Mammalname###undefined

然后我们创建一个新的 Cat,为 Cat 函数命名为 Felix。此 Cat 函数将其 name 属性设置为 FelixCat 函数完成,felix 包含一个Cat 对象,nameFelix .

那么为什么 Mammal 函数没有运行呢?好吧,确实如此,但是在设置继承时只有一次。如果您希望父类(super class)的构造函数作为子类初始化的一部分运行,您必须显式地执行此操作:

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);
}

但是 this.name = name;Cat 行没有用,您最好将其删除。

那么为什么您的 constructor 更改没有做任何事情?因为那不是 constructor 所做的。事实上,通读 ES5 规范,我没有看到 constructor 属性实际上被用于任何东西。更改 constructor 不会做任何事情,所以这就是它无关紧要的原因。

关于javascript - 如何在 Javascript 中使用父子构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27097014/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com