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

标签 javascript ecmascript-6 es6-class

使用 # 语法,我们现在可以创建 私有(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/

相关文章:

javascript - Ajax回调仅适用于jquery表单组列表中的顶部div

javascript - 输入值未显示在控制台中

javascript - Javascript 中的 `TimeEvent` 对象是什么?它有什么方法和属性?

node.js - 如何使用 sequelize v6 在 ES6 语法中关联模型

javascript - 如何动态解构一个巨大的 JSON 对象?

javascript - 单击删除/删除图像

javascript - 为摩卡测试引用环境变量

javascript - 为什么使用 push 或任何数组方法修改原始数组但将其分配给其他东西却没有?

javascript - 如何找出使用 Promise.any 解决的 promise ?

javascript - 在 javascript 中,子类中的字段初始化发生在父类中的构造函数完成之后。这是设计使然吗?