我有一个动物对象,我想创建一个狗对象,它继承自动物。
以下代码没问题:
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
谁能告诉我我错在哪里?非常感谢!
你想要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
,它将通过分配 toF
的prototype
属性来完成您尝试执行的操作。但是分配给prototype
属性只对构造函数(或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
但是像这样改变内置对象Object
是非常糟糕的做法 - 如果可能,请考虑另一种解决方案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句