ES6类私有财产只是语法糖吗?

伊娃·科恩(Eva Cohen)

现在,使用#语法,我们可以在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解决方案

TJ人群

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

php类课外的私有财产访问

来自分类Dev

告诉EF 6忽略私有财产

来自分类Dev

使用反射获取私有财产的私有财产

来自分类Dev

如何使用PropertyBuilder创建私有财产

来自分类Dev

自动修复和私有财产

来自分类Dev

打字稿错误:缺少私有财产?

来自分类Dev

私有财产子类化

来自分类Dev

访问子类的私有财产

来自分类Dev

嘲笑私有财产与嘲笑引发

来自分类Dev

私有财产和可变类型

来自分类Dev

访问子类的私有财产

来自分类Dev

课堂实施中的私有财产

来自分类Dev

构造函数内部的公共财产与私有财产

来自分类Dev

OOP-关于DDD的私有领域或私有财产制定者

来自分类Dev

私有财产和私有字段之间的区别

来自分类Dev

私有财产和持有静态价值的方法之间的区别?

来自分类Dev

为什么私有财产没有相同的范围?

来自分类Dev

科特林:只有吸气私有财产的可变

来自分类Dev

公开带有类别的私有财产

来自分类Dev

私有财产/公共获取者-javascript

来自分类Dev

Objective-C如何声明类别的私有财产?

来自分类Dev

私有财产的通用设置器/获取器方法

来自分类Dev

Json.Net-明确包含一个私有财产

来自分类Dev

Mobx中可观察到的私有财产

来自分类Dev

如何在JavaScript中定义公共和私有财产

来自分类Dev

私有财产/公共获取者-javascript

来自分类Dev

Objective-C私有财产的公共获取集方法

来自分类Dev

为什么可以在课堂之外访问私有财产?

来自分类Dev

Google Closure Compiler内联了重复使用的私有财产-漏洞还是我遗漏了一些东西?