gpt4 book ai didi

javascript - ES6 类私有(private)属性只是语法糖吗?

转载 作者:行者123 更新时间:2023-12-04 01:09:12 41 4
gpt4 key购买 nike

使用 # 语法,我们现在可以创建 私有(private)属性(property)在这样的 ES6 类中:

class Person {
#name;
constructor(name) {
this.#name = name;
}
getName() { return this.#name; }
}

let ron = new Person('ron')
ron.#name // undefined
ron.getName(); // ron
以前,在 ES5 中,私有(private)属性很难通过以下方式“伪造”:
function Person(name) {
var name = name;
this.getName = function() {
return name;
}
}
(new Person('ron')).name // undefined
(new Person('ron')).getName() // ron
上面的版本使用了事实'var'不属于Person实例的'this'。
因此使用'closure' getName 的力量可以访问'name'。
但是,问题在于 this.getName() 是 不是原型(prototype)链的一部分因此,为了将 getName 添加到原型(prototype)中,我们必须这样做:
Person.prototype.getName = function() { return this.getName(); }
这令人困惑,而且闻起来很糟糕。
另一种选择是:(使用 ES6 符号但仍然不使用类)
function Person(name) {
const nameSymbol = Symbol();
this[nameSymbol] = name;
this.getName = function() {
return this[nameSymbol];
}
}
但仍然没有解决 getName 不是原型(prototype)的一部分的问题。另一个问题是使用 Object.getOwnPropertySymbols,这个“假”私有(private)成员是可访问的。
另一个 es5 选项将是使用“Revleaing 模块模式”并像这样公开一个 publicAPI:
const myEs5Module = (function () { 
var _name = 'yos';
function getName() {
return _name;
}
const publicAPI = { getname };
return publicAPI;
})();
但这不是类或构造函数,它更像是一个模块。
所以我想了解 ES6 类中私有(private)属性的 '#' 语法是否是语法糖,并且可以以某种方式为像我这样的函数爱好者填充。
顺便说一句:我读过如下帖子:
Private properties in JavaScript ES6 classes
并且仍然感到不满意。
另请注意:我不是在寻找 ES6 模块/babel 解决方案

最佳答案

Are ES6 class private properties just syntactic sugar?


不,它们是对象在内部级别如何工作的基本补充。 Private fields (因为它们被称为)被保存在对象中的新插槽中,这些插槽在提案之前不存在并且无法以其他方式访问。

So I would like to understand if '#' syntax for private properties in ES6 classes is syntactic sugar and can be polyfilled in some way for function lovers like myself.


没有 class 就不能使用私有(private)属性句法。 ( future 的提议可能会改变这一点。)相反,你必须继续做你正在做的事情(关闭解决方案)或使用 WeakMap只有您的函数才能访问与属性相关的对象。
您已经完成了自己的闭包示例,所以这是您的 Person使用 WeakMap 的类方法而不是私有(private)属性:

const Person = (() => {
const names = new WeakMap();
function Person(name) {
names.set(this, name);
}
Person.prototype.getName = function getName() {
return names.get(this);
};
return Person;
})();

let ron = new Person("ron")
console.log(ron.name); // undefined
console.log(ron.getName()); // "ron"

关于javascript - ES6 类私有(private)属性只是语法糖吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65389915/

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