当前位置: 代码迷 >> JavaScript >> JavaScript原型继承
  详细解决方案

JavaScript原型继承

热度:115   发布时间:2023-06-05 11:59:56.0

我不了解某些内容>让我们看一下MDN的示例:

function Product(name, price) {
  this.name = name;
  this.price = price;

  if (price < 0) {
    throw RangeError('Cannot create product ' +
                      this.name + ' with a negative price');
  }

  return this;
}

function Food(name, price) {
  Product.call(this, name, price);
  this.category = 'food';
}

Food.prototype = Object.create(Product.prototype);
Food.prototype.constructor = Food; // Reset the constructor from Product to Food

为什么我必须写这部分:

Food.prototype = Object.create(Product.prototype);
    Food.prototype.constructor = Food;

不是Product.call(this, name, price); 已经将该属性(原型)从产品复制到食品了?

这就是在JavaScript中对类进行伪经典实例化的方式。 首先让我们看看您刚完成第一部分时会发生什么,但让我们添加一些内容以进行澄清:

function Product(name, price) {
  this.name = name;
  this.price = price;

  if (price < 0) {
    throw RangeError('Cannot create product ' +
                      this.name + ' with a negative price');
  }

  return this;
}

Product.prototype.declare = function () {
  console.log('I like ' + this.name);
} 

function Food(name, price) {
  Product.call(this, name, price);
  this.category = 'food';
}

在控制台中运行它,然后运行console.dir(Product) vs console.dir(Food) 食品与产品具有某些相同的属性。 但是, Food无法访问Product原型上的“声明”方法。 因此,我们需要设置Food的原型。 在上面的代码之后在控制台中运行此命令:

Food.prototype = Object.create(Product.prototype);

再次为Food运行console.dir 现在,Food的原型具有与Product相同的属性/方法。 但是,原型的构造函数现在为“产品”。 解决此问题的最后一步是设置Food.prototype.constructor使Food的构造函数再次是Food ,但具有Product所有属性/方法。

Food.prototype.constructor = Food;

在JavaScript中使用伪经典实例化实现完全继承是一个奇怪但逻辑的过程。

  相关解决方案