我正在尝试使用javascript的call
函数来理解链接构造函数。我正在查看here的示例。
我复制并粘贴了这个例子:
function Product(name, price) {
this.name = name;
this.price = price;
if (price < 0)
throw RangeError('Cannot create product "' + 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);
function Toy(name, price) {
Product.call(this, name, price);
this.category = 'toy';
}
Toy.prototype = Object.create(Product.prototype);
var cheese = new Food('feta', 5);
var fun = new Toy('robot', 40);
我感到困惑的是,call
和Food
的{{1}}函数在其“构造函数”中被调用,但是在我们调用{{1几行......或者我认为。
这里创建的对象究竟在哪里?当我们Toy
时,到底发生了什么?它是否正在创建Object.create(Product.prototype)
的实例?这与Product.call
有何关系?
答案 0 :(得分:0)
在调用构造函数的这两行中声明和实例化对象:
var cheese = new Food('feta', 5);
var fun = new Toy('robot', 40);
在实例化之前,声明函数构造函数Food
和Toy
,并将它们的原型设置为Product
的实例。这发生在以下几行:
function Food(name, price) {/*omitted*/}
Food.prototype = Object.create(Product.prototype);
function Toy(name, price) {/*omitted*/}
Toy.prototype = Object.create(Product.prototype);
关于对父构造函数的调用:
Product.call(this, name, price);
此行将调用Product
构造函数,在调用Food
构造函数时将Toy
或this
实例分配给Product
,同时传入名称和价格参数。如果您熟悉Java
,这与在派生类中调用super()
构造函数略有相似。