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

标签 javascript object

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

相关文章:

ruby-on-rails - Rails 4 : accepts_nested_attributes_for and mass assignment

javascript - 如何调用异步 JavaScript 函数并阻止原始调用者

java - 如何在数据库上实现快速搜索(如在 google 中)。

python - 在 Cython 中创建对象列表

javascript - 生成随机相同的对象

javascript - 如何循环遍历对象数组以查找包含相同单词的键值-Javascript

object - 有效地内省(introspection) Python 对象 IP 地址实例所有权

javascript - Ajax Mysql 查询

javascript - 用于提供网站反馈的按钮的固定位置 CSS

javascript - 无法删除 firebase 中的元素和子元素