【问题标题】:Child classes overwrite each other's methods子类覆盖彼此的方法
【发布时间】:2011-08-10 19:04:18
【问题描述】:

感谢 stackoverflow 海报的帮助,我已经设置了一些 oop javascript。但是,我遇到了另一个障碍。

我有两个具有相同继承的不同类。然后它们都有一个名称相同但做不同事情的函数。问题是,如果 ClassB 是最后定义的,那么即使我有一个 ClassA 对象,也要编写 classAInstance.MyFunction();它返回2,即ClassB的同名函数。

BaseClass = function(){
    ...init some stuff...
};

ClassA = function(){
    BaseClass.call(this);
    ...init some stuff...
};
ClassA.prototype = BaseClass.prototype; // innherit
ClassA.prototype.MyFunction(){
    return 1;
};

ClassB = function(){
    BaseClass.call(this);
    ...init some stuff...
};
ClassB.prototype = BaseClass.prototype; // innherit
ClassB.prototype.MyFunction(){
    return 2;
}

【问题讨论】:

  • +1 好问题值得点赞。

标签: javascript oop inheritance


【解决方案1】:

原因是因为ClassA和ClassB的原型都指向同一个对象。我不确定您的用例是什么,但最好让原型成为一个实例。

ClassA.prototype = new BaseClass();

...

ClassB.prototype = new BaseClass();

【讨论】:

  • 哇,谢谢大家。那成功了。我不敢相信你们都回答得这么快。再次感谢。
【解决方案2】:

您的问题是对象是通过引用而不是值传递的!

(实际上,从技术上讲,它是按价值计算的,但为了论证,该价值是一个参考)。

关键是,当你设置 ClassA.prototype.myFunction 时,你是在 BaseClass 的原型上定义一个新函数,因为记住 ClassA.prototype = BaseClass.prototype。

那么,当你设置 ClassB.prototype.myFunction 时,你又一次覆盖了 BaseClass.prototype.myFunction,然后是你的 ClassA 的函数!

【讨论】:

    【解决方案3】:

    在 JS 中执行继承的方法有很多种。您遇到的问题是,所有三个类实际上是相同的,因为它们引用BaseClass.prototype处的对象。

    从简单基类继承的一种简单方法是使用:

    ClassA.prototype = new BaseClass();
    

    ClassB.prototype = new BaseClass();
    

    对于更高级的类(即涉及参数的类)到构造函数,这将分崩离析。我记得 Douglas Crockford 有一个函数可以用来做一个更高级的扩展版本,但是我现在找不到它。

    【讨论】:

      【解决方案4】:

      您错误地设置了新类的原型

      BaseClass = function(){
          ...init some stuff...
      };
      
      ClassA = function(){
          BaseClass.call(this);
          ...init some stuff...
      };
      ClassA.prototype = new BaseClass(); // innherit
      ClassA.prototype.MyFunction(){
          return 1;
      };
      
      ClassB = function(){
          BaseClass.call(this);
          ...init some stuff...
      };
      ClassB.prototype = new BaseClass(); // innherit
      ClassB.prototype.MyFunction(){
          return 2;
      };
      

      【讨论】:

        【解决方案5】:

        通常,您不希望在任何相互嵌套或相互继承的对象网络中拥有两个同名的函数。为什么不将第二个 MyFunction(){ 重命名为其他名称?

        【讨论】:

        • 在强类型 OOP 语言中,interfaces 叫什么?!
        猜你喜欢
        • 1970-01-01
        • 2011-05-21
        • 1970-01-01
        • 1970-01-01
        • 2013-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-27
        相关资源
        最近更新 更多