如何重新定义“ this”并重用另一个类的方法。多态性

时间:2019-11-28 20:03:59

标签: javascript ecmascript-6 es6-class

我希望通过重新分配 this 的类在js中实现多态。

我简化了一个班级:

class First{
  method1 = function(aVar) { this.list.map (e => e === aVar)}
}

和另一个已经从另一个Parent类骚扰的类:

class Second extends Parent{
  constructor(){
    this.list = ['some elements'];
    this.method1 = First.method1.apply(this, arguments)
}

父级不能从第一个扩展; 当我运行 Second 时,它会引发错误: apply 无法应用于 method1 ,因为它没有防御性, 但是当我创建实例时,它会丢失 第二个 作用域:

class Second extends Parent{
  constructor(){
    this.list = ['some elements'];
    this.method1 = (new First).method1.apply(this, arguments)
}

我还需要为First.method1提供参数

我尝试了这个answer,但那没用

1 个答案:

答案 0 :(得分:1)

问题是function magic(str) { let rx = /^([^#\n]*\#)(.*)/; let string = str.replace(rx, function(m, g1, g2) { if (g1.endsWith("#")) { part1 = g1.replace(/\D+/g, "") + "#"; } else { part1 = g1.replace(/\D+/g, ""); } return part1 + g2.replace(/\D+/g, ""); }); return string; } // Test tests = { // keys is input string, value is valid result for that input "#1234a5678b910": "#12345678910", "12#34a5678b910": "12#345678910", "1234a56#78b910": "123456#78910", "1234a5678b91#0": "1234567891#0", "1234a5678b91#0": "1234567891#0", "98#765a4321#039c": "98#7654321039", "98a765#4321#039c": "98765#4321039", "98a765b4321###39": "987654321#39", } Object.keys(tests).map(k=> console.log(`${k} Test: ${(''+(magic(k)==tests[k])).padEnd(5,' ').toUpperCase()} ( result is ${magic(k)} - should be ${tests[k]})`) );会触发该函数,而您不想触发该函数,而是想创建具有更改的.apply()上下文的函数。为此,您想使用一个this方法来创建一个函数,但不触发它。看这段代码:

.bind()

因此class First { method1() { this.list.map(e => e) console.log('I got called'); } method2() { return this.list; } } class Parent {} class Second extends Parent { constructor(){ super(); this.list = ['second class list']; this.method1 = (new First()).method1.bind(this) this.theList = (new First()).method2.apply(this); } } const sec = new Second(); sec.method1(); console.log(sec.theList);类中的method1是方法的副本,具有与类Second相同的名称。它是使用First创建的,并将bind()更改为this类上下文。

然而,Second类中的theList字段是调用Second类中的method2()更改为{{ 1}}上下文。它不是函数,而是函数的结果。

看到区别了吗?