我是JS的新手,所以我试图找到一个使用ECMAScript 6的私有字段的好模式。
我正在使用在Node.js上运行的ES6课程(最新版本)。我提出了以下代码片段,但我不明白为什么用块声明的变量(在我可能不正确的理解中只有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
从上面的代码中,似乎这个私有字段甚至可以被继承。
所以问题是:
答案 0 :(得分:1)
您的_aNumber
(以let _aNumber = aNumber
声明)并不存在于课程范围之外。如果您尝试undefined
,则会获得console.log(_aNumber)
。
但JavaScript有一些名为closures的东西,"冻结"函数内部的变量。这意味着当您调用类的aNumber
方法时,let
变量仍然存在于该函数中。
此外,由于JavaScript函数是一流的,因此将this.aNumber
赋值给完全等同于将this.aNumber
赋值给返回值的函数,然后调用那个功能。
如,
let a = 'foo';
let b = function() {
return 'foo';
};
b();
console.log(a); // foo
console.log(b); // foo
很难说如果你做得对,那么,因为我不确定你的目标是什么。但是,了解有关闭包和first-class functions的更多信息可能有助于您更好地掌握变量的生命周期和变量赋值的性质。