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

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

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

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


使用简单的定义创建对象


图3

对象的属性

本部分讨论在原型链中,对象是如何从其他对象中继承属性,以及当你在运行时添加一个属性的时候会发生什么事情。

继承属性

假设你像图3中一样定义了一个WorkerBee的mark 对象,语句如下:

程序代码

mark = new  WorkerBee;

当JavaScript看到new操作符,它就创建一个新的通用对象,并且将这个新对象作为this的this关键字的值传递给WorkerBee构造函数。构造函数显式地设置projects属性的值。并且它会将WorkerBee.prototype的值设置为内部的 __proto__属性的值。(那个属性在两侧分别由两个下划线。)当这些属性被设置完之后,JavaScript将新对象返回,而赋值语句就会将 mark变量设置为那个对象。

这个过程并没有显式地给mark对象从原型链中继承的属性赋值(局部变量)。当你请求一个属性值的时候,JavaScript首先检查这个值在对象中是否存在。如果存在,就返回那个值。如果值在本地不存在, JavaScript会检查原型链(使用 __proto__)。如果在原型链里的某个对象有该属性的值,就返回那个值。如果没有找到这个属性,JavaScript会说对象没有这个属性。由此来说,mark对象有如下几个属性和值:

程序代码

mark.name =  "";
mark.dept = "general";
mark.projects =  [];

mark对象从mark.__proto__中的原型对象中继承了name和dept属性的值。它的projects属性被 WorkerBee构造器赋予了本地的值。简单地说,这给了你在JavaScript中对属性和属性值的继承。这个过程的一些细节将会在"又见属性继承" 部分讨论。

因为这些构造器不让你给特定的实例指定值,这些信息都是通用的。属性值都是默认值,由所有的WorkerBee新建对象所分享。你当然可以改变任何属性的值。所以,你可以像下面这样给mark一些指定的信息:

程序代码

mark.name =  "Doe, Mark";
mark.dept = "admin";
mark.projects  = ["navigator"];

添加属性

在JavaScript中,你可以在运行时给任何对象添加属性。并不限于使用构造器提供的属性。要给单独的对象添加特定的属性,你只需要简单地给对象赋值就可以了,像这样:

程序代码

mark.bonus = 3000;

现在,mark对象就有一个额外的属性了,任何其他的WorkerBee都没有这个属性。

如果你给一个对象添加了新的属性,而它又被一个构造器作为原型,你就为所有从该原型继承属性的对象添加了那个属性。举例来说,你可以给所有的雇员(employees)添加一个specialty属性,就使用下面的语句:

程序代码

Employee.prototype.specialty  = "none";

一旦JavaScript执行到这条语句,mark对象也会拥有这个specialty属性,且属性值为“none”。图4展示了向 Employee的原型添加这个属性,并且在Engineer原型中覆盖它。

添加属性

图 4

0
投稿

猜你喜欢

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