从同一个类中的另一个方法调用方法

时间:2017-04-26 19:15:17

标签: javascript ecmascript-6

为什么我收到错误:“Uncaught TypeError:self.myTest不是函数”?如何从javascript类中的另一个方法中调用方法?

class MyClass {

    myTest() {
      console.log('it works');
    }

    runMyTest() {
      self.myTest();
    }

}

var myClass = new MyClass();
myClass.runMyTest();

7 个答案:

答案 0 :(得分:11)

您需要使用this关键字而不是self

runMyTest() {
    this.myTest();
}

附注

如果要嵌套标准函数表示法,则this不是词法绑定(将是未定义的)。要解决此问题,请使用箭头函数(首选),.bind或在函数外部本地定义this



class Test {
  constructor() {
    this.number = 3;
  }

  test() {
    function getFirstThis() {
       return this;
    }

    const getSecondThis = () => {
       return this;
    };

    const getThirdThis = getFirstThis.bind(this);
    
    const $this = this;
    function getFourthThis() {
      return $this;
    }

    // undefined
    console.log(getFirstThis());
    
    // All return "this" context, containing the number property
    console.log(this); 
    console.log(getSecondThis());
    console.log(getThirdThis());
    console.log(getFourthThis());
  }
}

new Test().test();




答案 1 :(得分:7)

您需要使用this而不是self

runMyTest() {
  this.myTest();
}

然而,很多实现都喜欢保留引用并执行以下操作:

var self = this;

这可能是您将self视为自我参考的原因。如需进一步阅读,我建议SO - post

答案 2 :(得分:1)

class MyClass {

  myTest() {
   console.log('it works');
  }

  let runMyTest = ()=>{
   this.myTest();
  }

}

var myClass = new MyClass();

myClass.runMyTest();

使用箭头函数将其绑定到函数中。即使在打字稿上也能正常工作

答案 3 :(得分:0)



class MyClass {

    myTest() {
      console.log('it works');
    }

    runMyTest() {
      this.myTest();
    }

}

var myClass = new MyClass();
myClass.runMyTest();




答案 4 :(得分:0)

其他解决方案是将变量上下文$this的值保存在其他变量中,例如保存在this

使用的是this.anyFunction();

class MyClass {
    myTest() {
      console.log('it works');
    }

    runMyTest() {
      let this=$this;
      this.myTest();
    }
}

答案 5 :(得分:0)

<return xmlns:rmas="someURI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="fafa.xsd">
    <header>[...]</header>
    <body>
        <scheme>
            <data>
                <serial-no>1</serial-no>
                <employment>1</employment>
                <code>1234</code>
            </data>
        </scheme>
        <scheme>
            <data>
                <serial-no>1</serial-no>
                <employment>1</employment>
                <code>1234</code>
            </data>
        </scheme>
        <scheme>
            <data>
                <serial-no>1</serial-no>
                <employment>1</employment>
                <code>1234</code>
            </data>
        </scheme>
    </body>
</return>

答案 6 :(得分:0)

class MyClass(){
    constructor(){
         this.init();
    }

    init(){
         const $this = this;
         this.doSomethigElse();
    }

    doSomethingElse(){
         console.log("It worked!");
    }
}