在Javascript ES6类中调用方法时出现意外行为

时间:2017-05-10 16:10:24

标签: javascript class ecmascript-6

我最初是一名学习Javascript的C#开发人员。我正在尝试ES6课程。我希望ES6类的行为类似于常规类,但发现很多异常。

return redirect()->intended('/home')

我的问题:

  1. 内部class Test{ constructor(){ console.log("Constructor Invoked"); } instanceMethod1(){ console.log("instanceMethod1 Invoked"); } instanceMethod2InvokesInstanceMethod1(){ console.log("instanceMethod2InvokesInstanceMethod1 Invoked"); this.instanceMethod1(); //instanceMethod1(); //wont work in JS, but will work in C# } instanceMethod3InvokesStaticMethod1(){ console.log("instanceMethod3InvokesStaticMethod1 Invoked"); Test.staticMethod1(); //staticMethod1(); //Wont work in JS, but will work in C# } static staticMethod1(){ console.log("staticMethod1 Invoked"); } static staticMethod2InvokingStaticMethod1(){ console.log("staticMethod2InvokingStaticMethod1 Invoked"); this.staticMethod1(); Test.staticMethod1(); //staticMethod1(); //Wont work in JS, but will work in C# } static staticMethod3InvokingInstanceMethod1(){ console.log("staticMethod3InvokingInstanceMethod1 Invoked"); new Test().instanceMethod1(); //this.instanceMethod1(); //wont work } } var ob = new Test(); ob.instanceMethod1(); ob.instanceMethod2InvokesInstanceMethod1(); ob.instanceMethod3InvokesStaticMethod1(); Test.staticMethod1(); Test.staticMethod2InvokingStaticMethod1(); Test.staticMethod3InvokingInstanceMethod1(); - 为什么调用instanceMethod2InvokesInstanceMethod1不起作用?没有实例就无法调用实例方法,因此在实例方法中调用实例方法应该有意义吗?
  2. 内部instanceMethod1() - instanceMethod3InvokesStaticMethod1工作是否公平。但为什么我们不能直接致电Test.staticMethod1()
  3. 内部staticMethod1 - staticMethod2InvokingStaticMethod1如何运作?这里的this.staticMethod1()对象是什么?
  4. 在静态方法中,this有效,但不是this.staticMethod1()。为什么?我想回答问题3,应该有助于回答这个问题。
  5. 有人可以帮我。

1 个答案:

答案 0 :(得分:2)

你的第一个问题是假设Javascript的行为类似于C ++。有一些相似之处,但存在很多差异。您不应该立即预测在C ++中工作的东西将在Javascript中工作。它们不是同一种语言,当C ++开发人员开始学习Javascript时,这是一个常见的问题(它也发生在我身上)。

  

inside instanceMethod2InvokesInstanceMethod1 - 为什么调用instanceMethod1()不起作用?没有实例就无法调用实例方法,因此在实例方法中调用实例方法应该有意义吗?

不,Javascript不是C ++,也不提供该功能。调用方法时,必须使用对象前缀,即使在该对象的方法内也是如此。

  

里面的instanceMethod3InvokesStaticMethod1 - Test.staticMethod1()工作得足够公平。但是为什么我们不能直接调用staticMethod1?

同样,不是Javascript的一个功能。

  

inside staticMethod2InvokingStaticMethod1 - this.staticMethod1()如何工作?这个对象是什么?

您需要了解Javascript如何设置this值的规则。它通常根据方法的调用方式设置(尽管有一些方法可以取代它(如箭头函数)。请参阅Six ways this gets set以获取参考信息。

在这个特定的问题中,因为您调用了staticMethod2InvokingStaticMethod1,如下所示:Test.staticMethod2InvokingStaticMethod1();,该函数内的this指针将被设置为Test,这意味着您可以调用其他静态方法Test引用this.someOtherStaticMethod()。这是this设置方式的最基本规则。如果您拨打obj.method(),然后在method内,this指针将设置为obj

在Javascript中要意识到的重要一点是,方法只是一个普通的函数,碰巧是某个其他对象的属性。它对任何实例都没有特别的约束力。只有在调用方法时指定了这样的绑定时,它才会获得对实例的绑定。一个例外是箭头函数,它们不用于方法。在这些情况下,可以使用箭头语法声明函数,并且它的this值将在声明点设置为this的词法值。如果您刚刚开始学习这一点,我建议您跳过箭头功能,直到您掌握了this的所有其他内容。直到几年前它们才不是语言的一部分所以你可以在没有它们的情况下编写完美的Javascript(它们主要是用于某些目的的语法快捷方式)。

  

在静态方法中,this.staticMethod1()有效,但不是this.instanceMethod1()。为什么?我想回答问题3,应该有助于回答这个问题。

是的,正如您所期望的那样,答案与3相同。