为什么有必要使用Object.create()

时间:2014-08-07 17:40:12

标签: javascript oop object inheritance prototype

这是我的代码:

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

  if (price < 0) throw RangeError('Invalid');
  return this;
}

function Food(name, price) {
  Product.call(this, name, price);
  this.category = 'food';
}
Food.prototype = Object.create(Product.prototype);
var cheese = new Food('feta', 5);

当我在控制台中检查变量时,我看到以下内容:
Food {name: "feta", price: 5, category: "food"}

这就是我的预期。

但是,如果我省略Object.create(Product.prototype),我会看到相同的结果,因为Product.call

那就是说,在这种情况下最佳做法是什么?继承需要Object.create(Product.prototype),如果是,为什么?

1 个答案:

答案 0 :(得分:3)

这一行

Product.call(this, name, price);

具有相同的效果
this.name = name; //argument name from the function constructor
this.price = price; //likewise, argument of function constructor

但它没有设置Food对象的prototype属性。有了这条线

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

它确保如果查找Food对象的属性并且JavaScript找不到,它将遵循原型链到Product.prototype

让我们详细说明你的例子

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

   if (price < 0) throw RangeError('Invalid');
      return this;
}

并添加一个计算税的函数

Product.prototype.calculateTax = function() {
    return this.price * 0.1;
}

现在有了这一行

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

以下将正确计算税收

var cheese = new Food('feta', 5);
console.log(cheese.calculateTax());

省略该行

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

它会给出错误 TypeError:对象#没有方法&#39; calculateTax&#39;