代码之家  ›  专栏  ›  技术社区  ›  Gabriel Santos

父方法未使用实例化的子方法调用

  •  0
  • Gabriel Santos  · 技术社区  · 6 年前

    假设:

    class Parent {
      foo = (message) => 'parent and ' + message
    }
    
    class Child extends Parent {
      foo = (message = 'child foo') => super.foo(message)
    }
    

    为什么后续测试不通过?

    describe('Child', () => {
      it('should call parent foo and return \'parent and child foo\'', () => {
        const child = new Child()
        const expectedResponse = 'parent and child foo'
    
        const response = child.foo()
    
        expect(response).toBe(expectedResponse)
      })
    })
    

    引发错误: TypeError: (intermediate value).foo is not a function

    不应该 Parent S FO存在并被调用?

    2 回复  |  直到 6 年前
        1
  •  1
  •   charlietfl    6 年前

    当你把它们定义为方法时,效果很好。您遇到了箭头函数上下文问题

    class Parent {
      foo(message){return 'parent and ' + message} 
    }
    
    class Child extends Parent {
      foo(message = 'child foo'){return  super.foo(message)}
    }
    const child = new Child()
    console.log(child.foo())
        2
  •  1
  •   Dashiell Rose Bark-Huss    6 年前

    看起来最好在类内部使用方法语法。 https://javascriptweblog.wordpress.com/2015/11/02/of-classes-and-arrow-functions-a-cautionary-tale/ :

    “我从来没有觉得用箭头函数作为类方法的替身很舒服。方法的作用域应该根据调用它们的实例动态设置,但箭头函数根据定义是静态设置的。”