我在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行是什么意思向我们展示?
答案 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” - 如果你在构造函数中使用它,那么构造函数将作为第一个要调用的参数传入的任何内容 - 这样你就可以使用构造函数在任何你想要的东西上,因为你“伪造它”来处理任意对象。