当前在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 = true
在constructor
…但我不想“垃圾”我的构造,特别是当我有一个更大的类20-30 +参数。
我在考虑解决该问题的多种方法,但尚未找到任何好的方法。(例如:创建一个ClassConfig
处理程序,并传递一个parameter
与类分开声明的对象。然后该处理程序将附加到该类。我正在考虑WeakMaps
通过某种方式进行集成。)
您将如何处理这种情况?
更新:
现在有第3阶段的提案-我期待在几个月后使这个答案过时。
同时,使用TypeScript或babel的任何人都可以使用以下语法:
varName = value
在类声明/表达式主体内部,它将定义一个变量。希望在几个月/几周内,我将能够发布更新。
更新:Chrome 74现在附带此语法。
ES
Wiki中针对ES6中提案的注释(最大类别)注释:
没有(有意地)没有直接的声明方式来定义原型数据属性(方法以外的类)或实例属性
类属性和原型数据属性需要在声明之外创建。
在类定义中指定的属性被分配相同的属性,就像它们出现在对象文字中一样。
这意味着 您的要求已被考虑,并明确决定反对。
好问题。TC39的好人希望类声明声明和定义类的功能。不是它的成员。ES6类声明为其用户定义其合同。
请记住,类定义定义了 原型 方法-在原型上定义变量通常不是您要做的事情。您当然可以使用:
constructor(){
this.foo = bar
}
在像您建议的构造函数中。另请参见共识摘要。
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配置,因为它包含了一长串过滤器,在大多数情况下都是相同的。