[翻译]JavaScript中对象的层次与继承(4)
作者:chenzhe 来源:chenzhe 发布时间:2008-12-31 13:36:00
使用简单的定义创建对象
图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
猜你喜欢
- 一般写ASP PHP代码的朋友都估计是采用直接操作SQL的吧~ 看以下的代码 <% dim conn,rs&nbs
- function f(x){ alert(x); return
- 或许你也经历过,很多人都说一个女人很漂亮,而你觉得很一般。有时候,我也尝试理解为什么会对某个女人情有独钟。通常,我用迷人来描述,但这个&qu
- asp按关键字查询XML的问题 '-------------------------------------------------
- 前几天在“CSS那些事儿”的群中,一位读者朋友(小土豆)问我书中提到首字下沉的时候为什么要增加一个清除浮动。当时我自己一时迷惑了,为什么呢,
- 备份还原数据库备份数据库企业管理器--或用SQL语句(完全备份):backup database 数据库 to
- 在做项目的过程中,我们经常会建立各种各样的规范,以方便团队之间更好的合作更好的完成项目;同样我们也经常会听到各种各样的协议,比如Google
- 这是写给web设计者和前端开发者的教程,我们将演示如何使用Photoshop创建按钮的sprite图,然后是如何使用jQurey打造动态渐变
- 1.SQL Server 2005中的存储过程并发问题问:我在SQL Server2005中遇到了并发问题。我持有车票的公共汽车上有一些空闲
- 如何显示一个等待或欢迎信息? <% Response.Buffer = True %
- 301和302 Http状态有啥区别?301,302 都是HTTP状态的编码,都代表着某个URL发生了转移,不同之处在于:301 redir
- 使用方法和步骤如下:step1检测是否已经启用ServiceBroker,检测方法:SelectDATABASEpRoPERTYEX(
- 一、Browser Capabilities组件 该组件最主要的作用是:提取识别客户端浏览器的版本信息。其原理是这样的:当客户端浏览器向服务
- 1.建立设计规范的意义 建立设计文档的根本目的
- 全文索引在 MySQL 中是一个 FULLTEXT 类型索引。FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE
- 怎样才能将在表A取得的数据插入另一个表B中?(1)对于表A和表B两个表结构完全相同的话〔字段个数,相应字段的类型等等〕,可以使用 inser
- 看到有人用的PJBlog使用的是自动填写验证码,这样其实也不使用验证码基本上没有什么区别,很容易被 * ,因此在参照许多修改的基础上,找到
- 很多人都有研究闭合浮动元素的问题,但是解决方法却不一样,也并不是每一种方法都尽善尽美。闭合浮动元素(或者叫清除浮动)是web标准设计中经常会
- 以下保存成 App.xml , 与asp文件放在相同目录下! 代码如下: <?xml version="1.0"
- ..:: 巧用CSS制作艺术字 ::..如果灵活应用CSS各种滤镜的特点并加以组合,我们可以得到许多意想不到的效果。这是一些效果示范,供各位