【问题标题】:Can I patch an existing class to extend another class?我可以修补现有类以扩展另一个类吗?
【发布时间】:2020-11-06 07:12:53
【问题描述】:

我有以下课程,我无法更改它

class Foo {
  constructor() {
    console.log('foo')
  }
}

我想使用一个函数对其进行修补,以便它扩展另一个类(调用 super() 作为它的构造函数的第一行)

function extendWithBar(TargetCtor) {
  class Bar {
    constructor() {
      console.log('bar')
    }
  }

  //... secret sauce

  // Equivalent of "Foo extends Bar"
  // can extend other classes too
  return TargetExtendingBar
}

// FooBar is a new constructor, it doesn't need to relate to Foo
// it only needs to have the same constructor
const FooBar = extendBar(Foo)

const foobar = new FooBar()
// Output:
// "bar"
// "foo"

这在 JavaScript 中是否可行,如果可以,如何实现?

【问题讨论】:

  • 你可以直接做class Bar extends Foo 并打电话给 super 吗?还是我错过了什么?
  • 对不起,Bar 不知道它被用来扩展什么。在这种情况下,它是Foo,但它可以是任何类
  • 另外顺序很重要,我需要Foo 来扩展bar,而不是Bar 来扩展Foo
  • 你能检查一下这是否对你有帮助吗?:stackoverflow.com/questions/38546512/…
  • 不,如果Foo 还没有extend 另一个类,则以后无法添加它。您需要完全覆盖Foo

标签: javascript


【解决方案1】:

你需要扩展 class1 到 class2 像:

class class1{
  constructor(let x , let y){
     this.x = x;
     this.y = y;
  }
}

class class2 extends class1{

 // x & y just arguments for explaining  
 constructor(let x , let y){

   // calling class1 after extends
   super(x , y);
 }
}

【讨论】:

  • 我试图导致我有class1 extends class2class1class2 彼此不了解的情况。在class2 需要在class1 之前运行时,订单也很重要
  • 是的,在这种情况下,排序对于代码质量和 js 编译器非常重要,因此您需要先定义父级,然后再定义继承者
【解决方案2】:

我在考虑反应高阶组件。 ReactJS 文档说:
“具体来说,高阶 component 是一个 function,它接受一个 component 并返回一个 new组件。”
在您的情况下,它转换为:
“高阶 class 是一个 function,它接受一个 class 并返回一个 new class。”
编辑:我进行了编辑,因此它可以将类作为参数。

class Foo {
      constructor() {
        console.log('foo')
      }
    }


    function withBar(arg){
    return class extends arg{
      constructor(){
        console.log('bar')
        super()
      }
    }
    }

    const fooWithBar = withBar(Foo);
    new fooWithBar()

【讨论】:

  • 输出的顺序与OP要求的相反。
  • 这不起作用 - 你的 withBar 函数甚至没有使用它的参数
  • @Ava 我想我误解了 OPs 问题,我编辑了这篇文章,所以它像 Bergi 所说的那样进行争论。
  • 我再次编辑,现在超级构造函数在补丁构造函数运行后被调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-30
  • 2011-09-29
  • 1970-01-01
  • 2012-05-15
  • 2010-10-13
  • 1970-01-01
相关资源
最近更新 更多