现在,使用#语法,我们可以在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中,很难以以下方式“伪造”私有财产:
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()不属于原型链的一部分,因此为了将getName添加到原型中,我们必须要做的是:
Person.prototype.getName = function() { return this.getName(); }
这令人困惑并且闻起来很糟糕。
另一个选择是:(使用ES6符号并且仍然不使用类)
function Person(name) {
const nameSymbol = Symbol();
this[nameSymbol] = name;
this.getName = function() {
return this[nameSymbol];
}
}
但仍然不能解决getName不属于原型的问题。另一个问题是,使用Object.getOwnPropertySymbols可以访问此“伪”私有成员。
另一个es5选项将使用“ Revleaing模块模式”并公开如下所示的publicAPI:
const myEs5Module = (function () {
var _name = 'yos';
function getName() {
return _name;
}
const publicAPI = { getname };
return publicAPI;
})();
但这不是类或构造函数,更像是模块。
因此,我想了解ES6类中私有属性的'#'语法是否是语法糖,并且可以像我这样的函数爱好者以某种方式进行填充。
顺便说一句:我阅读了以下文章:JavaScript ES6类中的私有属性,但仍然感到不满意。另请注意:我不是在寻找ES6模块/ babel解决方案
ES6类私有财产只是语法糖吗?
否。它们是对象在内部级别如何工作的基本补充。专用字段(被称为字段)保存在提案中不存在的对象的新插槽中,并且无法通过其他方式访问。
因此,我想了解ES6类中私有属性的'#'语法是否是语法糖,并且可以像我这样的函数爱好者以某种方式进行填充。
没有class
语法就不能使用私有属性。(未来的建议可能会改变这一点。)相反,您必须继续做您正在做的事情(闭包解决方案),或者WeakMap
仅使用您的函数有权访问属性所涉及的对象的键。
您已经完成了自己的闭包示例,因此这是Person
使用WeakMap
方法而不是私有属性的类:
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"
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句