如何创建新对象继承JavaScript中的现有对象?

时间:2018-06-01 07:08:16

标签: javascript html

我有一个动物对象,我想创建一个狗对象,它继承自动物。

以下代码没问题:

var animal = {
    name: "animal",
    voice: function () {
        return 'haha';
    }
};

if (typeof Object.beget !== 'function') {
    Object.beget = function (o) {
        var F = function () {};
        F.prototype = o;
        return new F();
    }
}
var dog = Object.beget(animal);

dog.voice = function () {
    return 'wangwang';
};
document.writeln(dog.name);
document.writeln(dog.voice());
// animal 
// wangwang

但我希望像这样实现 Object.beget 函数:

if (typeof Object.beget !== 'function') {
    Object.beget = function (o) {
        var F = {};
        F.prototype = o;
        return F;
    }
}

创建一个空对象,并将其原型对象更改为动物对象,但这是错误的:

Uncaught TypeError: dog.voice is not a function

谁能告诉我哪里错了?非常感谢你!

1 个答案:

答案 0 :(得分:1)

你想要Object.create,它将创建一个新对象,其原型是作为第一个参数传递的对象:

var animal = {
    name: "animal",
    voice: function () {
        return 'haha';
    }
};

if (typeof Object.beget !== 'function') {
    Object.beget = (o) => Object.create(o);
}
var dog = Object.beget(animal);

dog.voice = function () {
    return 'wangwang';
};
document.writeln(dog.name);
document.writeln(dog.voice());
// animal 
// wangwang

另一种选择是使用setPrototypeOf,这将通过分配到F的{​​{1}}属性来执行您尝试执行的操作。但是,分配到prototype属性仅对构造函数(或prototype)有意义 - 如果您有对象(而不是<要设置原型的em> constructor ,请改用class。 (分配到setPrototypeOf属性也可以,但__proto__更好)

setPrototypeOf

但改变像var animal = { name: "animal", voice: function () { return 'haha'; } }; if (typeof Object.beget !== 'function') { Object.beget = function (o) { var F = {}; Object.setPrototypeOf(F, o); return F; } } var dog = Object.beget(animal); dog.voice = function () { return 'wangwang'; }; document.writeln(dog.name); document.writeln(dog.voice()); // animal // wangwang这样的内置对象是非常糟糕的做法 - 如果可能的话,考虑另一种解决方案。