假设想给上节讲的场景图库添加收集诊断信息的功能。这对于调试和性能分析很有用。

38条示例

给每个Actor实例一个唯一的标识数。

添加标识数

function Actor(scene,x,y){
this.scene=scene;
this.x=x;
this.y=y;
this.id=++Actor.nextID;
scene.register(this);
}
Actor.nextID=0;

现在我们需要对Actor的子类做同样的事。假设,Alien类代表太空飞船的敌人。除了其角色标识数外,我们希望每个外星人都有一个单独标识数。

function Alien(scene,x,y,direction,speed,strength){
Actor.call(this,scene,x,y);
this.direction=direction;
this.speed=speed;
this.strength=0;
this.damage=0;
this.id=++ Alien.nextID;
}
Alien.nextID=0;

这里导致Alien类与其父类Actor之间冲突。两个类都试图给实例属性id写数据。虽然每个类都认为该属性是“私有”的(即只有直接定义在该类中的方法才能获取该属性),然而事实是该属性存储在实例对象上并命名为一个字符串。如果在继承体系中的两个类指向相同的属性名,那么它们指向的是同一个属性。

执行

当我们调用下面这个代码来看一下,上面的执行过程。

var alien=new Alien(scene,0,0,'lt',100,10);

这个时候,首先调用Alien构造函数运行,创建一个空对象alien,把构造函数中的this绑定到alien上,然后运行Actor.call(alien,scene,0,0)产生了alien.id=++Actor.nextID,然后添加其它私有属性,但当又遇到id这个属性的时候,alien.id=++Alien.nextID,把上面从基类构造函数产生的id进行了修改。这个时候,id的属性就产生了歧义。

修正

因此,子类必须始终留意其父类使用的所有属性,即使那些属性在概念上是私有的。该例子显而易见的解决方法是对Actor标识数和Alien标识数使用不同的属性名。

function Actor(scene,x,y){
this.scene=scene;
this.x=x;
this.y=y;
this.id=++Actor.nextID;
scene.register(this);
}
Actor.nextID=0; function Alien(scene,x,y,direction,speed,strength){
Actor.call(this,scene,x,y);
this.direction=direction;
this.speed=speed;
this.strength=0;
this.damage=0;
this.alienID=++ Alien.nextID;
}
Alien.nextID=0;

提示

  • 留意父类使用的所有属性名

  • 不要在子类中重用父类的属性名

附录:完整结构关系图

下面是一张38条和39条里添加标识符后,所有类之间的关系图。

[Effective JavaScript 笔记]第39条:不要重用父类的属性名的更多相关文章

  1. [Effective JavaScript 笔记] 第4条:原始类型优于封闭对象

    js有5种原始值类型:布尔值.数字.字符串.null和undefined. 用typeof检测一下: typeof true; //"boolean" typeof 2; //&q ...

  2. [Effective JavaScript 笔记] 第5条:避免对混合类型使用==运算符

    “1.0e0”=={valueOf:function(){return true;}} 是值是多少? 这两个完全不同的值使用==运算符是相等的.为什么呢?请看<[Effective JavaSc ...

  3. [Effective JavaScript 笔记]第27条:使用闭包而不是字符串来封装代码

    函数是一种将代码作为数据结构存储的便利方式,代码之后可以被执行.这使得富有表现力的高阶函数抽象如map和forEach成为可能.它也是js异步I/O方法的核心.与此同时,也可以将代码表示为字符串的形式 ...

  4. [Effective JavaScript 笔记]第28条:不要信赖函数对象的toString方法

    js函数有一个非凡的特性,即将其源代码重现为字符串的能力. (function(x){ return x+1 }).toString();//"function (x){ return x+ ...

  5. [Effective JavaScript 笔记]第45条:使用hasOwnProperty方法以避免原型污染

    之前的43条,44条讨论了属性的枚举,但都没有彻底地解决属性查找中原型污染的问题.看下面关于字典的一些操作 'zhangsan' in dict; dict.zhangsan; dict.zhangs ...

  6. [Effective JavaScript 笔记]第20条:使用call方法自定义接收者来调用方法

    不好的实践 函数或方法的接收者(即绑定到特殊关键字this的值)是由调用者的语法决定的.方法调用语法将方法被查找的对象绑定到this变量,(可参阅之前文章<理解函数调用.方法调用及构造函数调用之 ...

  7. [Effective JavaScript 笔记]第47条:绝不要在Object.prototype中增加可枚举的属性

    之前的几条都不断地重复着for...in循环,它便利好用,但又容易被原型污染.for...in循环最常见的用法是枚举字典中的元素.这里就是从侧面提出不要在共享的Object.prototype中增加可 ...

  8. [Effective JavaScript 笔记]第55条:接收关键字参数的选项对象

    53节建议保持参数顺序的一致约定对于帮助程序员记住每个参数在函数调用中的意义很重要.参数较少这个主意不错,但如果参数过多后,就出现麻烦了,记忆和理解起来都不太容易. 参数蔓延 如下面这些代码: var ...

  9. [Effective JavaScript 笔记]第68条:使用promise模式清洁异步逻辑

    构建异步API的一种流行的替代方式是使用promise(有时也被称为deferred或future)模式.已经在本章讨论过的异步API使用回调函数作为参数. downloadAsync('file.t ...

随机推荐

  1. 人家为撩妹就鼓捣个网页,我做了个约炮APP(已开源)

    每年初夏第一场雷雨刚过,漫步河边的草坪,总是能闻到伴随着泥土的清新,这不是coco的前香,让人神魂颠倒:也不是gucci的后香,让人痴迷如梦.如24节气一样,它提醒人们,夏天到了.昨晚成都下了第一场雷 ...

  2. Object C学习笔记22-#define 用法

    上一篇讲到了typedef 关键字的使用,可以参考文章 Object C 学习笔记--typedef用法 .而在c中还有另外一个很重要的关键字#define. 一. #define 简介 在C中利用预 ...

  3. excel导入数据库

    日常工作中,感觉一些基础知识需要做下笔记,可能是刚毕业的缘故吧,还保持着做笔记的习惯,但根据以往经验,纸质笔记最多保持一年,过后想找已是难过登天.电子版笔记感觉很不错,尤其是发布到网络中.笔记内容是本 ...

  4. [设计模式] javascript 之 建造者模式

    建造者模式说明 1. 将一个复杂对象的 构造 与它的表示相分离,使同样的创建过程可有不同的表示,这就叫做建造者模式. 2. 面向对象语言中的说明,主要角色: 1>. Builder 这个接口类, ...

  5. git 命令的学习

    我们在安装好gitlab 之后就是怎么使用它了,这里我选择http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b806 ...

  6. jquery实现导航栏跟随窗口滚动

    最近在制作一个模版的时候用到的一个jquery插件,当网站导航滚动到当前可见页面顶部时,固定在顶部并随窗口滚动,有很多的网站前台模版有有类似的效果. smohan.fixednav.js /* * 随 ...

  7. Spring 事物机制

    Spring两种事物处理机制,一是声明式事物,二是编程式事物  声明式事物 1)Spring的声明式事务管理在底层是建立在AOP的基础之上的. 其本质是对方法前后进行拦截,然后在目标方法开始之前创建或 ...

  8. [Asp.net mvc] Asp.net mvc Kendo UI Grid的使用(四)

    有段时间没写博客了,工作状态比较忙,抽空继续总结下Grid的使用,这次主要介绍模板以及其他官网介绍不详尽的使用方法.先Show出数据,然后讲解下.后台代码: public ActionResult O ...

  9. The constructor ClassPathXmlApplicationContext(String) refers to the missing type BeansException

    Spring4.X配置一个简单的读取sping的xml的配置文件结果

  10. IIS7部署项目时提示:"错误消息 401.2。: 未经授权: 服务器配置导致登录失败。"的解决办法

    这个错误的定位:你的站点使用了Forms验证,而且在部署在生产环境的时候,设置错误,或者注释了. 解决方法如下: 1.检查Forms配置是否屏蔽. 2.有权限访问的资源是否已经开发. 基本就围绕以上两 ...