带有let的JS/EECMAScript6私有字段的模式
Pattern for JS/ECMAScript6 private fields with let?
我是JS的新手,所以我试图找到一个使用ECMAScript 6的私有字段的好模式。
我使用的是在Node.js(最新版本)上运行的ES6类。我想出了以下片段,但我不明白为什么用let声明的变量(在我可能不正确的理解中,它在ES6中只有块作用域)会在块执行后存活下来:
class PrivateTest {
constructor(aNumber) {
let _aNumber = aNumber;
//Privileged setter/getter with access to private _number:
this.aNumber = function(value) {
if (value !== undefined && (typeof value === typeof _aNumber)) {
_aNumber = value;
}
else {
return _aNumber;
}
}
}
}
const privateTest = new PrivateTest(99);
console.log(privateTest.aNumber());
privateTest.aNumber(86);
console.log(privateTest.aNumber());
console.log(privateTest._aNumber); //Undefined.
// Just to try inheritance:
class PrivateTest2 extends PrivateTest {
}
const privateTest2 = new PrivateTest2(13);
console.log(privateTest2.aNumber());
输出是这样的:
99
86
undefined
13
从上面的代码来看,这个私有字段似乎甚至可以被继承。
所以问题是:
- 我做得对吗
- _number的生命周期应该是什么
您的_aNumber
(用let _aNumber = aNumber
声明)不存在于类作用域之外。如果你尝试做console.log(_aNumber)
,你会得到undefined
。
但是JavaScript有一种叫做闭包的东西,它可以在函数内部"冻结"变量。这意味着,当您调用类的aNumber
方法时,let
变量仍然存在于该函数中。
此外,因为JavaScript函数是一流的,所以将this.aNumber
分配给一个值完全等同于将this.aNumber
分配给返回值的函数,然后调用该函数。
例如,
let a = 'foo';
let b = function() {
return 'foo';
};
b();
console.log(a); // foo
console.log(b); // foo
很难说你是否"做对了",因为我不太确定你要做什么。但是,更多地了解闭包和一流函数可能有助于您更好地了解变量的生命周期和变量分配的性质。
相关文章:
- 带有let的JS/EECMAScript6私有字段的模式
- 我怎么能让流星简单模式中的一个字段等于一个js变量,并且仍然让用户填写简单模式的其余部分
- Rad网格编辑模式通过选中复选框时的java脚本启用禁用所需的字段验证器
- 如何仅在字段为$dirty时应用ng模式
- 如何通过向用户推送模式引用来更新用户对象's数组字段
- 可以't散列密码并将其设置为mongodb模式中的字段
- 是否可以使find()和findOne()方法只返回模式字段
- 将模式与输入字段的最大长度相结合
- 我如何在文本输入字段中输入数字,而无需在 JavaScript 或 jQuery 中输入模式
- 如何在 dialog() 模式弹出窗口中的部分视图之间保留字段数据
- 更新现有数据时检索引导模式表单中的复选框字段的值时出现问题
- 如何使用 jQuery 将变量从隐藏字段发送到远程 PHP 文件,并在引导模式中显示脚本的结果,而无需刷新
- 尝试检测网格视图的哪一行处于编辑模式,然后在选中复选框字段时调整文本框
- 在 Jquery - jTable 中创建/更新模式的字段末尾添加自定义按钮,如提交按钮
- 如何验证输入字段以确保Javascript中的特定字符串模式
- 将焦点设置在模式框中的输入字段上
- 如何复制JavaScript's的提示函数在一个带有密码字段的新模式中
- 选择字段时清除模式窗体
- jquery输入字段模式
- RegEx来验证工作日志字段模式(以获取用户在任务上工作的时间)