我有一个动物对象,我想创建一个狗对象,它继承自动物。
以下代码没问题:
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
谁能告诉我哪里错了?非常感谢你!
答案 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
这样的内置对象是非常糟糕的做法 - 如果可能的话,考虑另一种解决方案。