Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ES6类私有属性只是语法糖吗?_Javascript_Ecmascript 6_Es6 Class - Fatal编程技术网

Javascript ES6类私有属性只是语法糖吗?

Javascript ES6类私有属性只是语法糖吗?,javascript,ecmascript-6,es6-class,Javascript,Ecmascript 6,Es6 Class,使用#语法,我们现在可以在ES6类中创建私有属性,如下所示: class Person { #name; constructor(name) { this.#name = name; } getName() { return this.#name; } } let ron = new Person('ron') ron.#name // undefined ron.getName(); // ron const myEs5Module = (f

使用#语法,我们现在可以在ES6类中创建私有属性,如下所示:

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

let ron = new Person('ron')
ron.#name // undefined
ron.getName(); // ron
const myEs5Module = (function () { 
  var _name = 'yos';
  function getName() {
    return _name;
  }
  const publicAPI = { getname };
  return publicAPI;
})();
以前,在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”。 但是,问题是这个.getName()不是原型链的一部分,因此为了将getName添加到原型中,我们必须执行以下操作:

Person.prototype.getName = function() { return this.getName(); }
这让人困惑,而且闻起来很难闻

另一种选择是:(使用ES6符号,但仍然不使用类)

但是仍然没有解决getName不是原型的一部分的问题。另一个问题是,使用Object.getOwnPropertySymbols,可以访问这个“伪”私有成员

另一个es5选项是使用“Revleaing模块模式”并公开如下publicAPI:

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

let ron = new Person('ron')
ron.#name // undefined
ron.getName(); // ron
const myEs5Module = (function () { 
  var _name = 'yos';
  function getName() {
    return _name;
  }
  const publicAPI = { getname };
  return publicAPI;
})();
但这不是一个类或构造函数,它更像是一个模块

因此,我想了解ES6类中私有属性的“#”语法是否是语法糖,对于像我这样的函数爱好者,是否可以以某种方式进行多重填充

顺便说一句:我读过如下帖子: 仍然感到不满意。 另请注意:我不是在寻找ES6模块/babel解决方案

ES6类私有属性只是语法糖吗

不,它们是对象在内部级别工作方式的基本补充。(正如他们所说的)保存在对象中的新插槽中,该插槽在提案之前不存在,并且无法以其他方式访问

因此,我想了解ES6类中私有属性的“#”语法是否是语法糖,对于像我这样的函数爱好者,是否可以以某种方式进行多重填充

如果没有
class
语法,则不能使用私有属性。(未来的建议可能会改变这一点。)相反,您必须继续执行您正在执行的操作(闭包解决方案)或使用
WeakMap
只有您的函数可以访问与属性相关的对象设置的关键帧

您已经完成了自己的闭包示例,下面是您的
Person
类,它使用
WeakMap
方法而不是私有属性:

constperson=(()=>{
const names=new WeakMap();
职能人员(姓名){
name.set(这个,name);
}
Person.prototype.getName=函数getName(){
返回名称。获取(此);
};
返回人;
})();
让ron=新人(“ron”)
console.log(ron.name);//未定义

console.log(ron.getName());//“ron”
在JS中与类有关的一切都是“语法糖”,私有属性是可聚合的,但问题是,如果您在调试器中记录类实例,您甚至可能会看到it@andymccullough-在私有属性和方法之前,这曾经是正确的,但现在不是了。@andymccullough FWIW,我进入了私有领域(以及一些其他的
特性,这些特性今年可能会进入第4阶段[“完成”)在我最近的新书《JavaScript:第18章中的新玩具》中有详细介绍。如果您感兴趣,请在我的个人资料中链接。这是一个非常有用的答案,也是对我理解的一个极好的奖励。非常感谢。我觉得有必要进一步澄清一些问题。我看到您使用WeakMap,其中“This”作为键,“name”作为值。这样每个实例都将根据需要保留自己的“名称”。但是如何处理:const Person=(()=>{let _name=null;function Person(name){{u name=name;}Person.prototype.getName=function getName(){return _name;};return Person;});const PersonFactory=function(name){const PersonMaker=Person();返回新的PersonMaker(name);}这不是我建议的生活,只是一个函数表达式。很抱歉,或者代码格式可能会让你感到困惑。我测试了它,它确实创建了不同的Mary和Joe。@EvaCohen-对不起,读得太快了。但这比你需要的复杂得多,它创建了一个全新的
(和
人.原型
)每次创建一个实例时,不要重用任何东西。最好只使用问题中第二个代码块中的
Person
函数,并直接结束参数。