这段代码有什么问题?有人可以帮助我处理 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/