[翻译]JavaScript中对象的层次与继承(6)
作者:chenzhe 来源:chenzhe 发布时间:2008-12-31 13:36:00
在构造器内指定属性,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"。


猜你喜欢
- 我们了解到gin可用通过类似DefaultQuery或DefaultPostForm等方法获取到前端提交过来的参数。参数不多的情况下也很好用
- 1、需要将时间字符串转换成datetime类型,语法:data[‘time'] = pd.to_datetime(data[‘tim
- 前面的例子中,点击事件都是通过click()方法实现鼠标的点击事件。其实在WebDriver中,提供了许多鼠标操作的方法,这些操作方法都封装
- 代码如下# -*- coding = utf-8 -*-# @time:2020/5/28/028 21:00# Author:cyx# @
- 在数据库应用的设计中,我们往往会需要获取某些表的记录总数,用于判断表的记录总数是否过大,是否需要备份数据等。我们通常的做法是:select
- 学校让我们在放假期间自觉Python,对于Python我是小白的不能再小白了。一切从头开始,找学习资料,看视频教程光看书看视频也不行还要自己
- 一、前端请求的封装1.将请求地址封装起来,以便日后修改,在src/assets/js目录下创建getPath.js文件export defa
- 如何做一个文本搜索? 比较简单,见下:<%Head = "搜索"SearchStri
- 本文实例分析了GO语言异常处理机制panic和recover。分享给大家供大家参考。具体如下:Golang 有2个内置的函数 panic()
- 在日常Java后端开发过程中,免不了对数据字段的解析,自然就少不了对字符串的操作,这其中就包含了正则表达式这一块的内容,这里面涉及Java包
- caller 属性返回一个对函数的引用,该函数调用了当前函数。functionName.caller functionName 对象是所执行
- 在刚接触C#的时候由于公司使用的就是Oracle数据库,那么C#怎么连接Oracle数据库就成了首要去掌握的知识点了。在那时没有ODP.NE
- <script>alert(escape("人"));alert(encodeURI("人&quo
- Google Chrome 的发布,使我们更加的注重基于 WebKit 核心的浏览器的表现情况,但我们很多时候“不小心”就会出现问题。考虑下
- pip是什么其实,pip就是 Python标准库(The Python Standard Library)中的一个包,这个包比较特殊,用它可
- 本文实例讲述了PHP实现的服务器一致性hash分布算法。分享给大家供大家参考,具体如下:<?php/** * 对服务器进行一致性has
- 方法 bindParam() 和 bindValue() 非常相似。 唯一的区别就是前者使用一个PHP变量绑定参数,而后者使用一个值。 所以
- 前言在golang中,当浮点数超过一定数值的时候,golang会把它弄成科学计数法的形式进行显示(好像只要大于七位数就变成科学计数法了)va
- /*不同服务器数据库之间的数据操作*/ --创建链接服务器 exec sp_addlinkedserver 'ITSV ',
- 创建python虚拟环境virtualenv、virtualenvwrapper1,为什么需要搭建虚拟环境由于当机器上两个项目依赖于相同包的