这是我的代码:
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)
,如果是,为什么?
答案 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;