javascript中的.call是如何工作的?

时间:2011-06-29 15:31:25

标签: javascript

我在MDN网站上看到过这段代码:

01  function Product(name, value){
02     this.name = name;
03     if(value >= 1000)
04        this.value = 999;
05     else
06        this.value = value;
07  }
08   
09  function Prod_dept(name, value, dept){
10     this.dept = dept;
11     Product.call(this, name, value);
12  }
13   
14  Prod_dept.prototype = new Product();
15   
16  // since 5 is less than 1000, value is set
17  cheese = new Prod_dept("feta", 5, "food");
18   
19  // since 5000 is above 1000, value will be 999
20  car = new Prod_dept("honda", 5000, "auto");

它表示你可以使用对链构造函数的调用。我有一些问题:

1)为什么第14行被称为为什么我们将它添加到原型中?为什么这意味着在我们创建Prod_dept时调用Product?

2)第11行是什么意思?这与原型有什么关系?

3)第20行是什么意思向我们展示?

4 个答案:

答案 0 :(得分:5)

1)将Product的实例设置为Prod_dept的原型对象,将Product实例(及其原型)的值和方法添加到所有Prod_dept的原型链中{1}}个实例。

它还允许instanceof显示从Product_dept创建的对象是两个构造函数的实例

var a = new Product();
var b = new Product_dept();

a instanceof Product       // true
a instanceof Product_dept  // false

b instanceof Product       // true
b instanceof Product_dept  // true

2)由于this是由Prod_dept构建的新对象,.call允许您将该对象设置为this的{​​{1}}值方法,以便Product方法对Product实例的this方法做什么(在这种情况下,运行代码以将值添加到Prod_dept和{ {1}}属性)。

3)它只是从name构造函数创建一个新实例。

总的来说,这是使用JavaScript的原型继承机制的一种模式。

答案 1 :(得分:2)

代码只是在JavaScript中展示原型继承。

1)代码在第14行上说的是,您希望Prod_dept函数继承基本Product函数的属性和特征。

JavaScript中的每个函数都有一个prototype属性,它包含一个可以添加方法和属性的对象。

Prototype是一个特殊的属性,一旦定义了函数就会被创建。它的初始值是一个空对象{},但是可以覆盖它以允许您定义自己的方法或从其他函数继承它们。

2)第10行只是为你的Prod_dept函数分配一个属性,dept参数提供的值是通过构造函数传递的。

3)第14行允许您将其他两个参数“name,value”应用于基本Product函数,但是在Prod_dept函数的上下文中。有关该方法的更多信息,请参见here

答案 2 :(得分:0)

1)第14行使Prod_dept继承Dept对象 - 无论何时实例化Prod_dept,它都使用Dept作为基础对象。

2)第10行只是在对象的.dept属性中存储单词“auto”和“food”。

3)第20行:当Prod_dept被实例化时,JS也将实例化一个Dept对象,并且该构造函数(第1行)将value参数限制为最多为999(第3-6行)

答案 3 :(得分:0)

1)使用原型继承 - prod_dept继承自Product。更多信息,如果你google“原型继承”。

2)这是构造函数的作用 - 初始化“dept”成员。

3)与上面的注释一起,它只显示所有构造函数都将被调用,因此它们实际上是链接的。

我认为你的问题忽略了一点。关于调用的神奇之处在于第一个参数在被调用函数中将是“this” - 如果你在构造函数中使用它,那么构造函数将作为第一个要调用的参数传入的任何内容 - 这样你就可以使用构造函数在任何你想要的东西上,因为你“伪造它”来处理任意对象。