gpt4 book ai didi

javascript - JS/ECMAScript6 私有(private)字段的模式与 let?

转载 作者:行者123 更新时间:2023-12-03 06:55:37 24 4
gpt4 key购买 nike

我是 JS 新手,因此我正在尝试找到一种使用 ECMAScript 6 拥有私有(private)字段的良好模式。

我正在使用在 Node.js(最新版本)上运行的 ES6 类。我想出了以下代码片段,但我不明白为什么用 let 声明的变量(在我可能不正确的理解中,ES6 中只有 block 作用域)将在 block 执行后继续存在:

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

从上面的代码来看,这个私有(private)字段似乎还可以被继承。

所以问题是:

  • 我做得对吗?
  • _number 的生命周期应该是怎样的?

最佳答案

您的_aNumber(使用let _aNumber = aNumber声明)不存在于类作用域之外。如果您尝试执行 console.log(_aNumber),您将得到 undefined

但是 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的信息可能会帮助您更好地掌握变量的生命周期和变量赋值的本质。

关于javascript - JS/ECMAScript6 私有(private)字段的模式与 let?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37287667/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com