【问题标题】:How the Constructor of the 'bambi' object is Animal?“bambi”对象的构造函数如何是动物?
【发布时间】:2021-10-26 06:05:30
【问题描述】:
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() 将 Cat 的原型分配给 Animal 原型。为什么bambi对象的构造函数是Animal而不是Cat?

【问题讨论】:

  • ES6 之前的构造函数真的很没用。 (例如,除了阅读构造函数是什么之外,你真的无能为力。)你的 Q 底线是你用 Animal.prototype 替换了 Cat.prototype,这导致你的 Cat“成为”(继承)一切在 Animal... 包括构造函数。

标签: javascript oop


【解决方案1】:

查找“无类的javascript继承”

MDN page 上是这样写的:

  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 类而不是手动执行此操作

【讨论】:

    猜你喜欢
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 2021-09-15
    • 2013-10-20
    • 2021-10-22
    • 2013-06-16
    相关资源
    最近更新 更多