Raj*_*rma 6 javascript node.js
在当前版本的NodeJS 即 12.x.x,我们可以宣布private由类领域的#some_varible符号。该#符号将使该特定类的变量私有字段。
class Foo {
#some_varible = 10;
}
Run Code Online (Sandbox Code Playgroud)
我有以下问题:
如何使用这个变量?
您可以将其用作访问器属性的支持字段:
class Foo {
#some_variable = 10;
get some_variable () {
console.log('getting some_variable');
return this.#some_variable;
}
set some_variable (value) {
console.log('setting some_variable');
this.#some_variable = value;
}
}
let bar = new Foo();
console.log(bar.some_variable);
console.log(bar.some_variable = 42);Run Code Online (Sandbox Code Playgroud)
或者您可以像普通属性一样使用它,主要区别在于它只能从范围内访问class { ... },因为它是私有的,并且该属性以#.为前缀。
还要注意的this.#some_variable是不一样的this['#some_variable'],后者是指字符串属性,而不是私有字段。
在生产应用程序中使用此类符号来声明私有类字段是否安全?
答案是视情况而定。
使用客户端 JavaScript,您无法控制执行环境,但您可以使用Babel 插件将新的语言特性(例如私有类字段)转换为功能等效项,仅依赖于旧语言规范中的语法。
在 Node.js 中,您确实可以控制执行环境,因此要使用新的语言功能,只需确保您使用的是支持语法的版本。
当某些类字段被声明为私有时,它如何在后台(在 nodejs 中)工作?
私有字段使用块范围的符号,这些符号从反射方法中被列入黑名单Object.getOwnPropertySymbols()。
以下是模拟此实现的转换后的类可能如下所示:
let Foo;
{
const some_variable = Symbol('#some_variable');
{
const getOwnPropertySymbolsImpl = Object.getOwnPropertySymbols;
Object.getOwnPropertySymbols = function getOwnPropertySymbols () {
return getOwnPropertySymbolsImpl.apply(this, arguments)
.filter(symbol => symbol !== some_variable);
};
}
Foo = class Foo {
[some_variable] = 10;
};
}
let bar = new Foo();
console.log(bar);Run Code Online (Sandbox Code Playgroud)
这会产生与本机实现非常相似的输出:
@babel/plugin-proposal-class-properties私有字段存储为 aWeakMap其中每个条目是一个类实例键及其各自的私有字段属性描述符值。
以下是 Babel 如何转换我们一直用作示例的类:
class Foo {
constructor() {
_some_variable.set(this, {
writable: true,
value: 10
});
}
}
var _some_variable = new WeakMap();
Run Code Online (Sandbox Code Playgroud)
请注意,虽然_some_variable此处不是块范围的,但 Babel 将确保转换后的输出中的名称不会与该范围内的任何可见名称冲突,因此从预编译源中无法访问弱映射。
| 归档时间: |
|
| 查看次数: |
267 次 |
| 最近记录: |