【问题标题】:How can we call a method inside class in ES7?我们如何在 ES7 中调用类内部的方法?
【发布时间】:2018-08-13 09:54:01
【问题描述】:

ES6 简单示例

class MyClass extends SuperClass {
  constructor() {
    super()
    this.myProperty = 'myProperty'
  }
}

在 ES7 中,前面的例子可以写成:

class MyClass extends SuperClass {
  myProperty = 'myProperty'
}

在 ES6 中,我们可以像这样在构造函数中调用方法:

import myMethod from './myMethod'
class MyClass extends SuperClass {
  constructor() {
    super()
    myMethod()
  }
}

在 ES7 中,我们如何调用将被称为构造方法的方法?

import myMethod from './myMethod'
class MyClass extends SuperClass {
  myMethod()
}

语法错误:意外的令牌,应为 {


PS:我知道我仍然可以使用 ES6 语法。但是有没有不写构造函数的方法呢?

【问题讨论】:

  • 为什么你认为 ES6 和 ES7 在复古兼容性方面会有所不同?在 ES6 中有效的在 ES7 中有效。
  • 我不认为你可以。第一个“ES7”示例是创建一个变量。第二个是调用方法,就是这个必须在构造函数中完成。
  • PS: I know I can still use the ES6 syntax. But is there a way without writing constructor? "ECMAScript 2016 只引入了两个新功能:Array.prototype.includes() ,指数运算符" medium.freecodecamp.org/… ,您为什么期望首先存在的功能?您收到一个错误,因为您最后一个代码 sn-p 的语法不是有效的 javascript,没有更多内容。
  • 你在类体中调用myMethod(),这是错误的原因,es6和es7的方法调用绝对没有区别
  • 几天前,我还看到一个控制台错误,关于 import chrome 中的 {export 语句。

标签: javascript ecmascript-2016


【解决方案1】:

这是一种在不编写构造函数的情况下实现该目标的可能方法,但这不是您应该做的事情 - 类字段用于分配给 的属性实例化的对象。如果它不是对象的属性,则应该在构造函数中完成。

function myMethod() {
  console.log('method running');
}

class SuperClass { }
class MyClass extends SuperClass {
  someIrrelevantPropName = (myMethod(), undefined)
}
const someInstantiation = new MyClass();

请注意,这实际上会将undefined 分配给someInstantiation.someIrrelevantPropName。也就是说,'someIrrelevantPropName' in someInstantiation 将评估为true,所以这个逗号运算符漏洞利用并非没有副作用。

【讨论】:

  • 如果没有启用 Babel,您的代码将无法运行。到目前为止,这不是有效的 javascript。某些浏览器可能支持它,但例如 Chrome 不支持它。它不在规范中。在未启用 Babel 的情况下,someIrrelevantPropName = (myMethod(), undefined) 这一行将产生错误。
  • @CertainPerformance,您能否详细说明一下或指导我看一篇文章?让我知道我是否正确理解。 someIrrelevantPropName 调用 myMethod() 然后将其值设置为 undefined?
【解决方案2】:

TL;DR - 你不能,你应该像在 ES6 中那样做。

您对属性所做的事情是class fields declaration proposal 的一部分,您想要的方法声明不是该提案的一部分。

该提案目前处于第 3 阶段,这意味着它还不是官方 ECMAScript 规范的一部分,但可能很快就会推出(可能在 ES2019 中?)。因此,我什至建议不要使用您在示例中使用的类属性,因为它的语法仍然可以更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    相关资源
    最近更新 更多