【发布时间】:2017-05-30 06:44:05
【问题描述】:
我想创建一个BankAccount 类,其中一个新实例跟踪新实例的检查和保存。但是,每当有人创建一个新实例时,我想要一个静态方法来调用一个静态字段,该字段仅与 BankAccount 类相关联,它可以跟踪打开的银行账户数量(有点像单身人士的行为) .这在 c#/java 中是可行的,但很难在 Javascript 中重新创建预期的行为。
我也在 ES5 中尝试过,但结果很短,这是我使用函数作为包装器来封装的最接近的行为:
function BankAccountMaker() {
var countOfAccounts = 0;
function IncrementcountOfAccounts() {
countOfAccounts += 1;
}
function BankAccount(c = 0) {
this.checking = 0;
}
return {
makeBankAccount: function (c) {
IncrementcountOfAccounts();
console.log(countOfAccounts)
return new BankAccount(c);
}
}
}
最后,几个问题:
- 有人可以编写与上述等效的 ES6 代码吗?
- 另外,在不需要包装器的 ES5 中有没有更好的方法来做到这一点?
- 为什么在 ES5 中我们可以将原型方法设置为原始方法,但使用 ES6 语法似乎无法做到这一点? (我使用的是 Node 6.1 和 Babel fwiw)
【问题讨论】:
-
“仅与 BankAccount 类相关的静态字段,用于跟踪打开的银行账户数量” - 不要。这正是(全局/静态,可变)单例不好的原因。它泄漏内存并且是非模块化的(不可测试的)。在创建实例的方法中保留跟踪记录。就像您对
BankAccountMaker所做的一样。 -
"为什么在 ES5 中我们可以将原型方法设置为原始方法,但使用 ES6 语法似乎无法做到这一点?" - 请单独询问对此提出问题,并为您的意思提供示例代码。顺便说一句,方法不是原语。
-
对代码的改进:1) 内联
IncrementcountOfAccounts2) 将BankAccount放在BankAccountMaker之外,这不是需要访问计数的闭包 - 这将避免重新创建相同的类.然后将其转换为 ES6,只需将BankAccount设为class。
标签: javascript ecmascript-6 es6-class