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


猜你喜欢
- 引言:Python中的变量在使用中很流畅,可以不关注类型,任意赋值,对于开发来说效率得到了提升,但若不了解其中的机理,往往也会犯一些小错,让
- WTForms 是用于web开发的灵活的表单验证和呈现库,它可以与您选择的任何web框架和模板引擎一起工作,并支持数据验证、CSRF保护、国
- Python脚本常见参数获取和处理平常写 python 脚本时会有一些从命令行获取参数的需求,这篇文章记录下常见的参数获取和处理方式。1.
- 深入理解 Python 虚拟机:集合(set)的实现原理及源码剖析在本篇文章当中主要给大家介绍在 cpython 虚拟机当中的集合 set
- 1 简介大家好,我们在日常使用 Python 的过程中,经常会使用 json 格式存储一些数据,尤其
- 前言:之前的文章我们已经开启了爬虫程序的exe之旅,但是我们最终实现的程序存在一个非常大的问题,当进行网络请求的时候,程序卡死,直到数据请求
- 前言上一次简单了解了协程的工作原理 前文链接最后提到了几个使用协程时会遇到的问题,其中一个就是主线程不会等待子线程结束,在这里记录两种比较简
- (一)ts文件下载网页文件下载其实都可以通过requests.get以文件流的形式获取,并以字节的形式写入本地文件即可。代码如下:impor
- 新版本的selenium已经明确警告将不支持PhantomJS,建议使用headless的Chrome或FireFox。两者使用方式非常类似
- 最近看到很多关于MySql相关的语法,小白也想学习一些MySQL的存储过程的写法,因此就想安装MySQL,过程中遇到过一些问题,这里记录下来
- 1、打印九九乘法表#只打印结果for i in range(1,10): for j in range(1,i+1): &nbs
- 用Python实现批量测试一组url的可用性(可以包括HTTP状态、响应时间等)并统计出现不可用情况的次数和频率等。类似的,这样的脚本可以判
- 一、 申请企业微信账号,申请地址 https://qy.weixin.qq.com/二、 登陆企业微信账图一图二2、添加微信账号图
- 本文实例为大家简单分享javascript、jquery实用demo,供大家参考,具体内容如下javascript判断H5页面离开funct
- 我们知道了钢琴键盘的音高是其实是有规律的,如下频率翻倍,高一个八度国际基准音:440Hz,钢琴键盘上对应小字一组的la小字一组的la可以看下
- 因为旧电脑不幸挂了,所以要在新电脑上面重新安装Python。一看官网发现已经更新到3.8.5+了,乖乖,真是迭代快啊。虽然之前安装过一次,不
- 一、前言今天学习视频时课后作业是找出1000以内既是素数又是回文数的数,写代码这个很容易,结果一运行遇到了bug,输出结果跟预期不一样,调试
- 当用GOOGLE查的时候,内容几乎都是一样的。但是你想要的东西,一个也没有。例如,我就找不到中国人写的如何使用PYTHON来创建一个XML文
- 写models.py时缺少了一个 verbose_name,导致数据库出现问题,整了很久,摸索出重新建立数据库的方法:首先删除每个app中的
- eval()在print干事情之前,先看看这个东东。不是没有用,因为说不定某些时候要用到。>>> help(eval)&n