'bambi'对象的构造函数如何是动物?


let log = console.log;
function Animal(name)
{
this.name = name;
}
Animal.prototype.walk = function(){
log(`${this.name} walks`);
}
function Cat(name)
{
Animal.call(this,name);
this.lives = 9;
}
Cat.prototype = Object.create(Animal.prototype);
Cat.prototype.meow = function(){
log("Meow!");
}
let bambi = new Cat("Bambi");
log(bambi.constructor)  // function Animal(name){  this.name = name;  }

我已经使用Cat构造函数创建了'bambi'对象,但是在检查bambi的构造函数时,它返回了Animal构造函数。我已经使用Object.create()将猫的原型分配给动物原型。为什么bambi对象的构造函数是Animal而不是Cat?

查找没有class的javascript继承

在MDN页面上是这样写的:

  1. 在之前添加的内容下面添加以下行:
Teacher.prototype = Object.create(Person.prototype);

复制到剪贴板这里,我们的朋友create()再次来拯救我们。在本例中,我们使用它来创建一个新对象,并将其作为Teacher.prototype的值。新对象有Person。prototype作为它的原型,因此,如果需要的话,它将继承Person.prototype.

中所有可用的方法。
  1. 在我们继续之前我们还需要做一件事。添加最后一行后,Teacher的构造函数属性。prototype现在等于Person(),因为我们刚刚设置了Teacher。prototype来引用从Person.prototype继承其属性的对象!尝试保存代码,在浏览器中加载页面,并在控制台中输入Teacher.prototype.constructor进行验证。
  1. 这可能会成为一个问题,所以我们需要将其设置正确。您可以通过返回源代码并在底部添加以下行来实现:
Object.defineProperty(Teacher.prototype, 'constructor', {
value: Teacher,
enumerable: false, // so that it does not appear in 'for in' loop
writable: true });
  1. 现在,如果您保存并刷新,输入Teacher.prototype.constructor应该返回Teacher(),正如所希望的那样,加上我们现在继承了Person()!
因此,基于此,你的代码需要添加这个小部分:
Object.defineProperty(Cat.prototype, 'constructor', {
value: Cat,
enumerable: false, // so that it does not appear in 'for in' loop
writable: true });

请看下面的工作演示:

let log = console.log;
function Animal(name)
{
this.name = name;
}
Animal.prototype.walk = function(){
log(`${this.name} walks`);
}
function Cat(name)
{
Animal.call(this,name);
this.lives = 9;
}
Cat.prototype = Object.create(Animal.prototype);
Object.defineProperty(Cat.prototype, 'constructor', {
value: Cat,
enumerable: false, // so that it does not appear in 'for in' loop
writable: true });
Cat.prototype.meow = function(){
log("Meow!");
}
let bambi = new Cat("Bambi");
log(bambi.constructor);

但是,我建议只使用ES6类,而不是手动执行

相关内容

  • 没有找到相关文章

最新更新