zoukankan      html  css  js  c++  java
  • [Effective JavaScript 笔记]第39条:不要重用父类的属性名

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

    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条里添加标识符后,所有类之间的关系图。
    1466152749159

  • 相关阅读:
    scala学习笔记:理解stream和view
    scala学习笔记:变量声明中的模式
    scala学习笔记:理解并行集合par
    快速了解Scala技术栈
    scala学习笔记:控制抽象
    scala中的call-by-name和call-by-value
    scala学习笔记:各种奇怪的写法
    scala学习笔记:match与unapply()
    scala学习笔记:无参函数
    scala学习笔记:函数与方法
  • 原文地址:https://www.cnblogs.com/wengxuesong/p/5594476.html
Copyright © 2011-2022 走看看