问题描述
我不了解某些内容>让我们看一下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);
已经将该属性(原型)从产品复制到食品了?
1楼
eddyjs
1
2015-07-30 15:05:30
这就是在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中使用伪经典实例化实现完全继承是一个奇怪但逻辑的过程。