网络编程
位置:首页>> 网络编程>> JavaScript>> [翻译]JavaScript中对象的层次与继承(6)

[翻译]JavaScript中对象的层次与继承(6)

作者:chenzhe 来源:chenzhe 发布时间:2008-12-31 13:36:00 

标签:类,对象,继承,javascript,编程


在构造器内指定属性,take 2

图 6

让我们详细地看看这些定义。下面就是Engineer类的构造器的新定义。

程序代码

function  Engineer (name, projs, mach) {
this.base = WorkerBee;
this.base(name, "engineering", projs);
this.projects  = mach || "";
}

假设我们像下面这样创建Engineer对象:

程序代码

jane = new  Engineer("Doe, Jane", ["navigator",  "javascript"], "belau");

JavaScript会执行如下步骤:

1.首先,new操作符创建一个通用的的对象,然后设置它的__proto__属性为Engineer.prototype。

2.new操作符将新的对象传递给Engineer构造器,作为this关键字的值。

3.然后,构造器为对象创建一个叫做base的新属性,并且将base属性的值设置为WorkerBee的构造器。这使得WorkerBee构造器成为了Engineer对象的一个方法。

注意:base属性的名字并没有什么特别的。你可以使用任何的合法属性名;起名为base仅仅是为了直观一些。

4.下一步,构造器调用base方法,并将传递给构造器的参数中的两个("Doe, Jane"和["navigator", "javascript"])以及字符串“engineering”再传递给base。在构造器内显式地使用“engineering”表明所有的 Engineer对象对于继承的dept属性都拥有相同的值,而且这个值会覆盖从Employee继承的值。

5.因为base是Engineer的方法,在对base的调用中,JavaScript将this关键字绑定到第一步创建的对象上。这样, WorkerBee函数依次将"Doe, Jane"and["navigator", "javascript"]参数传递给Employee构造函数。当Employee构造函数返回的时候,WorkerBee函数使用剩余的参数来设置 projects属性。

6.当从base方法返回的时候,Engineer构造器初始化对象的machine属性为“belau”。

7.当从构造器返回的时候,JavaScript将新对象赋值给jane变量。

你可能认为,已将在Engineer构造器的内部调用WorkerBee的构造器了,你就完成了对Engineer对象继承关系的设置。但是事实却不是这样。调用WorkerBee的构造器确保了Engineer对象开始的时候就具有了所有构造函数中指定的属性。然而,如果你之后又向Employee或者 WorkerBee的原型添加属性,那些属性将不会被Engineer对象所继承。举例来说,假设你写了如下的语句:

程序代码

function  Engineer (name, projs, mach) {
  this.base = WorkerBee;
  this.base(name, "engineering", projs);
  this.projects  = mach || "";
}
jane = new Engineer("Doe, Jane",  ["navigator", "javascript"],  "belau");
Employee.prototype.specialty = "none";

jane对象并不会继承specialty属性。你仍然需要显示地设置原型来确保动态的继承。假设你写了如下语句:

程序代码

function  Engineer (name, projs, mach) {
  this.base = WorkerBee;
  this.base(name, "engineering", projs);
  this.projects  = mach || "";
}
Engineer.prototype = new  WorkerBee;

jane = new Engineer("Doe, Jane",  ["navigator", "javascript"],  "belau");
Employee.prototype.specialty = "none";

现在jane对象的specialty属性是"none"。

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com