2

代码来自Mozilla网站

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);/// why not this be Product(name,price)
   this.category = 'food';
}
Food.prototype = new Product();

可能很傻的东西,看不懂这条线
Product.call(this, name, price);

既然 Product 和 Food 都是全局函数,为什么我们必须使用 Product.call

4

6 回答 6

3

Product函数是一个构造函数,通常会使用new. 在调用函数时使用new创建一个新的空对象,并以新对象为上下文调用函数,同时也建立了原型链。

在这个例子Food中是子类化Product,它想在 的新实例上运行 Product 构造函数Food

一个例子应该让事情变得清楚:

var f = new Food ('apple', 10)

f.name = 'apple'
f.price = 10
f.category = 'food'

Product通过使用 的新实例调用构造函数,将名称和价格类别添加到对象中Food

于 2013-01-25T15:09:53.693 回答
2

因为你想Product在食物对象上应用这个函数。仅仅调用它call会导致错误的this,并且添加的属性Product将附加到错误的对象上。

也在这里学习关于继承

于 2013-01-25T15:04:58.560 回答
2
Product.call(this, name, price);

此行this以调用对象和名称和价格作为参数调用产品函数

这使您可以将产品视为 Food 的一种方法,而无需明确指定它。如果不这样做,产品内对“this”的任何调用都将指向全局对象。相反,它们现在被分配给正在创建的 Food 实例。

在这种情况下,这样做的一个可能目的是使用 Product 在构造函数中准备对象,而不使 product 成为 Food 对象定义的永久部分(如果您将其分配为 Food 的方法,则会发生这种情况,同时仍然允许它被其他人重用(如果您将其作为构造函数的逻辑的一部分或构造函数中的内部函数,这是不可能的)

于 2013-01-25T15:06:10.007 回答
1

在这种情况下

Product.call(this, name, price);

this -> 是 Food 实例,而不是 window

于 2013-01-25T15:05:38.930 回答
1

在 JavaScript 中有多种调用函数的方法。

其中之一是通过调用call函数对象的方法。它接受上下文(this函数内部的含义)和函数的参数作为其他参数。

例子:

var context = { foo: 'bar' };
function func(a, b, c) {
   console.log(this.foo);
   console.log(a, b, c);
}
func.call(context, 1, 2, 3);
//'bar'
//1 2 3

call还有一种与它类似的方法apply。它接受两个参数——上下文和带有函数参数的数组。

于 2013-01-25T15:05:53.363 回答
1

call函数是所有Function对象的方法。它允许您将特定上下文传递给函数,本质上是设置this函数内部的关键字。

call() 的 MDN 文档

于 2013-01-25T15:05:54.320 回答