当前位置: 首页 > 面试题库 >

ES6类变量替代

祁嘉言
2023-03-14
问题内容

当前在ES5中,我们许多人在框架中使用以下模式来创建类和类变量,这很方便:

// ES 5
FrameWork.Class({

    variable: 'string',
    variable2: true,

    init: function(){

    },

    addItem: function(){

    }

});

在ES6中,您可以本机创建类,但是没有选择可以使用类变量:

// ES6
class MyClass {
    const MY_CONST = 'string'; // <-- this is not possible in ES6
    constructor(){
        this.MY_CONST;
    }
}

可悲的是,上述方法不起作用,因为类只能包含方法。

我知道我可以this.myVar = trueconstructor…但我不想“垃圾”我的构造,特别是当我有一个更大的类20-30 +参数。

我在考虑解决该问题的多种方法,但尚未找到任何好的方法。(例如:创建一个ClassConfig处理程序,并传递一个parameter与类分开声明的对象。然后该处理程序将附加到该类。我正在考虑WeakMaps通过某种方式进行集成。)

您将如何处理这种情况?


问题答案:

更新:

现在有第3阶段的提案-我期待在几个月后使这个答案过时。

同时,使用TypeScript或babel的任何人都可以使用以下语法:

varName = value

在类声明/表达式主体内部,它将定义一个变量。希望在几个月/几周内,我将能够发布更新。

更新:Chrome 74现在附带此语法。

ES
Wiki中针对ES6中提案的注释(最大类别)注释:

没有(有意地)没有直接的声明方式来定义原型数据属性(方法以外的类)或实例属性

类属性和原型数据属性需要在声明之外创建。

在类定义中指定的属性被分配相同的属性,就像它们出现在对象文字中一样。

这意味着 您的要求已被考虑,并明确决定反对。

但为什么?

好问题。TC39的好人希望类声明声明和定义类的功能。不是它的成员。ES6类声明为其用户定义其合同。

请记住,类定义定义了 原型 方法-在原型上定义变量通常不是您要做的事情。您当然可以使用:

constructor(){
    this.foo = bar
}

在像您建议的构造函数中。另请参见共识摘要。

ES7及更高版本

ES7 +属性初始化器

等等,给属性赋值似乎是定义类的必要方法!没错,但是,由于它是惯用语言,因此我们以这种方式设计了它。我们完全希望用于属性初始化的更具声明性的语法会在将来的JavaScript版本中出现。它可能看起来像这样:

// Future Version 
export class Counter extends React.Component { 
    static propTypes = { 
        initialCount: React.PropTypes.number
    }; 

    static defaultProps = {
        initialCount: 0
    }; 

    state = {
        count: this.props.initialCount
    }; 

    tick() {
        this.setState({
            count: this.state.count + 1 
        });
    }

    render() {
        return ( <div onClick={this.tick.bind(this)}> Clicks: { this.state.count } </div> ); 
    } 
}


 类似资料:
  • 目前在ES5中,我们很多人都在框架中使用以下模式来创建类和类变量,这很舒服: 在ES6中,您可以原生地创建类,但没有使用类变量的选项: 可悲的是,上面的方法行不通,因为类只能包含方法。 我知道我可以在中……但我不想‘垃圾’我的构造函数,特别是当我有20-30+个参数用于一个更大的类时。 我想了很多办法来处理这个问题,但还没有找到好的办法。(例如:创建一个处理程序,并传递一个与类分开声明的对象。然后

  • 主要内容:1.变量初始化,2.变量声明的有效语法类型,JavaScript变量范围,JavaScript初始化不吊装变量是内存中的命名空间,用于存储值。 变量的名称也称为标识符。 命名变量(标识符)时应牢记一些规则。 这些规则如下: 它可以包含数字和字母。 不能以数字开头变量的名称。 关键字不能用作变量的名称。 除美元()符号和下划线()外,标识符不包含空格和特殊字符。 1.变量初始化 变量初始化是将值存储在变量中的过程,可以在使用变量之前随时对其进行初始化。 ES6语法使用关键字声明变量。 在

  • “新”工具Oracle SQLcl未解释” 预期的答案是:(使用sqlplus)

  • 问题内容: 三年来,我一直在使用一些JavaScript小片段,但是现在我正在构建一个React应用程序,并且正在研究它。有一件我不了解的基本事情。React使用Dispatcher and Stores构建其Flux模式,我不明白的是,该Dispatcher在所有应用程序中都是可见的,因为Actions使用分派器来分派动作,而Stores向Dispatcher注册以获取通知(因此并非每次都是新的

  • ES5中的函数本质上是可以在外面“看到”,但不能进入的容器。 在ES6中,var仍然以这种方式工作,使用函数作为容器,但有两种新的方法来声明变量:和let。 const和let使用{和}块作为容器,故称为“块作用域”。 块作用域在循环期间非常有用。 考虑以下代码: var i; for (i = 0; i < 10; i += 1) { var j = i; let k = i; } co

  • 在为Logback appender指定实现类时,是否可以使用变量替换?例如, 如上所述指定时,Logback似乎试图加载名称为“${LOGFILE_APPENDER_CLASS}”的类。也就是说,不执行变量替换! 我想将输出发送到eclipse开发人员的生产和控制台中的文件。如果可能的话,我不想重复appender配置,因为它包含了一长串过滤器,在大多数情况下都是相同的。