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

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

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

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

构造器中的全局信息

当你创建构造器的时候,如果你要在构造器中设置全局信息就需要小心了。举个例子,假设你想要给每个新的employee都自动设置一个独一无二的ID。你可能会这么定义Employee:

程序代码

var idCounter =  1;

function  Employee (name, dept) {
  this.name = name ||  "";
  this.dept = dept ||  "general";
  this.id = idCounter++;
}

使用这个定义,当你创建一个新的Employee的时候,构造器会设置序列中的下一个ID并且将全局的IE计数器加一。所以,如果你的后续语句是:

程序代码

victoria = new  Employee("Pigbert, Victoria", "pubs")
harry =  new Employee("Tschopik, Harry", "sales")

victoria.id是1 并且harry.id是 2。第一眼看起来一切正常。然而,idCounter在每次Employee对象被创建的时候都会加一,而不管你是处于什么目的。如果你像我们之前那样创建整个Employee层次,每当我们设置一次原型的时候Employee构造器都会被调用一次。也就是说,假设你有如下代码:

程序代码

var idCounter =  1;

function  Employee (name, dept) {
  this.name = name ||  "";
  this.dept = dept ||  "general";
  this.id = idCounter++;
}

function  Manager (name, dept, reports) {...}
Manager.prototype = new  Employee;

function  WorkerBee (name, dept, projs) {...}
WorkerBee.prototype = new  Employee;

function  Engineer (name, projs, mach) {...}
Engineer.prototype = new  WorkerBee;

function  SalesPerson (name, projs, quota) {...}
SalesPerson.prototype = new  WorkerBee;

mac = new  Engineer("Wood, Mac");

进一步假设我们省略的定义中设置了base属性,并且调用了处于原型链上游的构造器。在这里例子中,到mac对象被创建的时候,mac.id 是 5。

根据应用的不同,计数器被额外多加这么几次不一定有没有影响。如果你关心计数器的精确值,一个可能的解决方案需要使用下面这个替代的构造器:

程序代码

function  Employee (name, dept) {
  this.name = name ||  "";
  this.dept = dept ||  "general";
  if (name) this.id  = idCounter++;
}

当你Employee的实例是为了作为原型的时候,你不会向构造器提供参数。使用这个构造器定义,当你不提供参数的时候,构造器不会设置id值,也不会更新计数器的值。自然而然,想要让一个Employee取得id,你必须给employee指定一个姓名。在我们的例子中,mac.id将会是1。

0
投稿

猜你喜欢

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