通过javascript调用了解链接构造函数()

时间:2014-02-10 10:18:13

标签: javascript inheritance

我正在尝试使用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);

我感到困惑的是,callFood的{​​{1}}函数在其“构造函数”中被调用,但是在我们调用{{1几行......或者我认为。

这里创建的对象究竟在哪里?当我们Toy时,到底发生了什么?它是否正在创建Object.create(Product.prototype)的实例?这与Product.call有何关系?

1 个答案:

答案 0 :(得分:0)

在调用构造函数的这两行中声明和实例化对象:

var cheese = new Food('feta', 5);
var fun = new Toy('robot', 40);

在实例化之前,声明函数构造函数FoodToy,并将它们的原型设置为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构造函数时将Toythis实例分配给Product,同时传入名称和价格参数。如果您熟悉Java,这与在派生类中调用super()构造函数略有相似。

相关问题