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

Exi*_*tos 6 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");
Run Code Online (Sandbox Code Playgroud)

它说你可以使用调用链构造函数.我有一些问题:

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

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

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

use*_*716 5

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

它还允许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
Run Code Online (Sandbox Code Playgroud)

2)因为this是由构造的新对象Prod_dept,所以.call允许您将该对象设置为方法的thisProduct,这样无论该Product方法如何处理都this将在该新Prod_dept实例上完成(在这种情况下,运行用于添加值的代码)namevalue属性).

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

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


Mar*_*c B 0

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

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

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