[Effective JavaScript 笔记]第39条:不要重用父类的属性名
2016-06-17 16:45
337 查看
假设想给上节讲的场景图库添加收集诊断信息的功能。这对于调试和性能分析很有用。
现在我们需要对Actor的子类做同样的事。假设,Alien类代表太空飞船的敌人。除了其角色标识数外,我们希望每个外星人都有一个单独标识数。
这里导致Alien类与其父类Actor之间冲突。两个类都试图给实例属性id写数据。虽然每个类都认为该属性是“私有”的(即只有直接定义在该类中的方法才能获取该属性),然而事实是该属性存储在实例对象上并命名为一个字符串。如果在继承体系中的两个类指向相同的属性名,那么它们指向的是同一个属性。
这个时候,首先调用Alien构造函数运行,创建一个空对象alien,把构造函数中的this绑定到alien上,然后运行Actor.call(alien,scene,0,0)产生了alien.id=++Actor.nextID,然后添加其它私有属性,但当又遇到id这个属性的时候,alien.id=++Alien.nextID,把上面从基类构造函数产生的id进行了修改。这个时候,id的属性就产生了歧义。
不要在子类中重用父类的属性名
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条里添加标识符后,所有类之间的关系图。相关文章推荐
- ECharts迁徙图
- JSON中parse和stringify的应用
- Ionic Js十二:导航ion-nav-view
- 程序语言的抽象
- Jsp+Servlet+MyBatis完成分页查询
- JavaScript正则表达式
- js实现鼠标悬浮切换 setTab 代码实现
- BZOJ1443: [JSOI2009]游戏Game
- 去掉shiro登录时url里的JSESSIONID
- 求解!!关于ajax传值却自动打开浏览器下载的问题
- 数组与字符串的相互转化 Js
- Javascript 中 atob 方法解码中文字符乱码问题
- 在jsp中引用其他的jsp页面的问题
- FastJSON 浅显透析
- PB9.0对使用js的encodeuri
- JavaScript获取当前url根目录(路径)
- C#读取Json文件出现乱码解决方案
- Javascript函数初探
- EJS 是什么 ,怎么用,以及优点
- JS实现的自定义显示加载等待图片插件(loading.gif)