【问题标题】:Class Inheritance for members成员的类继承
【发布时间】:2019-03-23 17:28:43
【问题描述】:

我有一个八叉树课程。八叉树的一个关键特性是它可以创建自己的孩子。

class Octree {
  ...
  createChildren(){
    ...
    /* for each of the 8 new children*/
    this.children.push(new Octree(/*someargs*/))
    ...
  }
}

现在我想继承八叉树类,但是,我也希望孩子成为被继承的类。例如class LODWorldTree extends Octree,另外包含一些游戏的渲染器数据。但是,如果我调用LODWorldTree.createChildren(),那么LODWorldTree.children 将是Octrees 的数组,而不是LODWorldTrees。

解决此问题的最佳方法是什么?在写这篇文章时,我发现我可以存储Octree.myClass = /*some inherited class*/,并为从Octree 继承的所有类手动设置此变量。有没有更好的方法来做这样的事情?也许是this.prototype

【问题讨论】:

  • 当你打印 this.children 时你想要那些是继承类的实例吗?
  • 如果您不想使用this.constructor,子类可以用自己的实现覆盖createChildren()
  • @PatrickRoberts 目标是找到一个不需要重写八叉树的基本核心特性的实现。继承的重点是避免重写。

标签: javascript inheritance javascript-objects


【解决方案1】:

您可以利用每个对象通过原型引用其自己的构造函数这一事实:

class A {
  constructor() {
    this.val = 1;
    this.children = [];
    this.typeName = `I'm A`;
  }
  
  addSelfChild() {
    this.children.push(new this.constructor(this.val + 1));
  }
}

let a = new A(1);
a.addSelfChild();
a.addSelfChild();

console.dir(a);

class B extends A {
  constructor(val) {
    super(val);
    this.typeName = `I'm B`;
  }
}

let b = new B(1);
b.addSelfChild();
b.addSelfChild();

console.dir(b);

【讨论】:

  • 您可能想要 - 而不是 this.constructor - 使用 Object.getPrototypeOf(this).constructor。虽然后者更冗长,但当“this”碰巧拥有任何类型的自己的属性“构造函数”时,它将继续正常运行。
  • 您的val 似乎没有做任何事情,但除此之外,这将起作用。谢谢。
  • @GreenFox - val 仅用于展示如何根据您的 /*someargs*/ 要求应用此解决方案。
  • @JeffreyWesterkamp 虽然getPrototypeOf(...) 在某些情况下很有用,但我认为constructor 是一种不应该被篡改的语言功能。我个人会拒绝这样做的代码。出于这个原因,我没有看到增加冗长的好处。
  • 我完全同意这是一种不好的做法。尽管如此,这是一种可能性,而且这是一个简单的解决方法。至少值得考虑,并且可能对其他访问者有价值。
【解决方案2】:

尝试使用constructor属性:

this.children.push(new this.constructor(/*someargs*/));

this.constructor是当前对象的构造函数的引用,所以调用它会产生同一个类的新实例

【讨论】:

    猜你喜欢
    • 2013-12-22
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 2012-02-13
    • 2012-03-30
    • 2016-08-16
    • 2010-09-20
    • 1970-01-01
    相关资源
    最近更新 更多