[翻译]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


猜你喜欢
- 很久之前就对jQuery.animate的实现非常感兴趣,不过前段时间很忙,直到前几天端午假期才有时间去研究。jQuery.animate的
- 环境搭建1、下载所需的软件包:(1)python安装包(2)django安装包以下2个包其实是安装python包管理工具,在后面安装djan
- 我就废话不多说了,大家还是直接看代码吧!'''Created on 2018-4-4'''k
- 一、源码安装首先安装开发工具包yum groupinstall -y "Development tools"安装依赖软件
- 本文实例讲述了Python实现的维尼吉亚密码算法。分享给大家供大家参考,具体如下:一 代码# -*- coding:utf-8 -*-#ke
- MySQL低调宣布它将不再把MySQL企业版服务器作为一个tar包发布,而这距离这个公司宣布将MySQL分为免费版和付费版的时间还不到一年。
- 我有大量的重要数据要从SQL Server导出到Access或Excel文件中去,手工做太麻烦,还有其它的好办法吗?有,我们在 SQL Se
- 为cd2sc.com网站功能而开发,代码为本人原创,生成速度一般。 (出于众所周知的原因,涉及到数据库的数据字段名称做了改动,并且为了代码明
- 在pytorch下,以数万首唐诗为素材,训练双层LSTM神经网络,使其能够以唐诗的方式写诗。代码结构分为四部分,分别为1.model.py,
- MySQL由于它本身的小巧和操作的高效, 在数据库应用中越来越多的被采用.我在开发一个P2P应用的时候曾经使用MySQL来保存P2P节点,由
- 实验1.1 列表a = [1, 2, 3, 4]for i in a: print(i)  
- 一、项目需求前言:BBS上每个id对应一个用户,他们注册时候会填写性别(男、女、保密三选一)。经过检查,BBS注册用户的id对应1-3000
- 视频观看视频Pygame模块之pygame.draw本文将主要介绍Pygame的draw模块,主要内容翻译自pygame的官方文档pygam
- 如下所示:# -*- coding: utf-8 -*-# @Time : 2018/5/17 15:05# @Author :
- 一、排名开窗函数概述SQL Server的排名函数是对查询的结果进行排名和分组,TSQL共有4个排名函数,分别是:ROW_NUMBER、RA
- 一、父组件向子组件传值(props)步骤:在父组件中通过 v-bind 将数据传给子组件在子组件中通过 props 接收父组件传递过来的数据
- import time,datetime import urllib2 def
- 背景:调试服务最好的方式就是直接上机实践。对在公司的员工来说,在同一套服务上协同开发比在单独的环境上开发,应该会更有感觉。有问题可以一起发现
- 如下所示:public function a(){ return $this->belongsTo('App\Mo
- replace() 方法用于将字符串用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。 需要注意的是:如果用正则表达式替换时, r