gpt4 book ai didi

JavaScript 对象继承 - 我做错了什么?

转载 作者:行者123 更新时间:2023-11-29 16:27:14 25 4
gpt4 key购买 nike

这段代码有什么问题?有人可以帮助我处理 JavaScript 对象继承吗?我开始觉得自己像个白痴!!

提前致谢,山姆

function Human(name, sex) {
this.name = name;
this.sex = sex;
};

function Man(name) {
Man.prototype = new Human(name, "Male");
};

var m = new Man("Sam Striano");
alert(m.name); //<-- = Undefined

最佳答案

你想要这个:

function Man(name) {
Human.call(this, name, "Male");
}

该代码的作用

看来您只是想调用父级的构造函数 Human ,这不一样的是原型(prototype)继承。上面的代码采用 Human 的构造函数并将其应用于this - 一个新的Man对象。

您的代码的作用

线路Man.prototype = new Human(name, "Male")正在改变Man的原型(prototype)每次创建一个新人。不仅如此,您还完成了对原型(prototype)对象的重新分配,因此它将仅适用于在该分配之后创建的对象,即不是第一个对象。因此,m.name未定义。

正确的原型(prototype)继承

请注意,调用父级的构造函数(如我上面的代码所示)不会导致 Man自动继承分配给 Human.prototype 的任何方法。最好的方法是克隆 Human.prototype进入Man.prototype但在任何构造函数之外。像这样:

function Man(name) {
Human.call(this, name, "Male");
}

function inherit(parent, child) {
if (Object.create) child.prototype = Object.create(parent.prototype);
else {
for (var key in parent.prototype) {
if (!parent.prototype.hasOwnProperty(key)) continue;
child.prototype[key] = parent.prototype[key];
}
}
}

inherit(Human, Man);

这可能看起来相当冗长,替代方案可能是这样做:

Man.prototype = new Human('no name', 'Male');

会起作用,但会导致不必要的副作用,因为我们被迫为 prototype 分配一个无用的名称。 ,它让 Human 的构造函数调用额外的时间来分配原型(prototype)。如果您遵循此路径并稍后更改 Human,请注意构造函数不仅仅将属性分配给 this .

关于JavaScript 对象继承 - 我做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4788168/

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