Javascript-原型继承
Javascript- prototype inheritance
我不明白的东西>让我们看看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
原型上的"declare"方法。因此,我们需要设置Food
的原型。在上述代码之后在控制台中运行此命令:
Food.prototype = Object.create(Product.prototype);
再次运行console.dir
for Food
。现在,Food有一个与Product
具有相同属性/方法的原型。然而,原型的构造器现在是"Product"。修复此问题的最后一步是设置Food.prototype.constructor
,因此Food
的构造函数再次为Food
,但具有Product
的所有属性/方法。
Food.prototype.constructor = Food;
在JavaScript中通过伪经典实例化实现完全继承是一个奇怪但合乎逻辑的过程。
相关文章:
- JavaScript对象不是从原型链继承的
- 如何使用原型继承编写一个整洁灵活的复杂javascript应用程序
- $emit,$broadcast,原型继承
- Javascript:继承原型而不重新定义构造函数
- 原型继承未按预期工作
- JavaScript中的原型继承.我可以称之为“超级”等价物吗?
- 为什么函数对象的实例没有继承函数原型属性
- 不创建父对象的原型继承
- Javascript基本继承与Crockford原型继承
- JavaScript-构造函数参数和原型继承
- 使用Object.create作为原型的原型继承将[Object]作为实例的原型
- javascript继承中正确的原型做作是什么
- 如何进行JavaScript原型继承(原型链)
- Javascript原型继承原型函数调用
- 对象不继承原型函数
- 从其他类继承原型方法,而不重写自己的原型方法
- JavaScript继承原型
- 继承原型
- Javascript继承/原型混淆
- 使用.call(this)继承原型