在 es5 中我们使用构造函数
function Person(name,gender){
var initial =""; // we use var key word to make variable private
function getNameWithInitial(){ // this is the private method to get name with initial
console.log(this);
initial = this.gender ==="male"?"Mr. ":"Mrs. ";
return initial + this.name;
}
this.name = name;
this.gender = gender;
this.getName = function(){
return getNameWithInitial.call(this);
}
}
var manas = new Person("Manas","male");
console.log(manas.getName());
我的问题是如何在 es6 类中声明私有变量和私有方法
原文由 manas 发布,翻译遵循 CC BY-SA 4.0 许可协议
实现这一目标的一种方法是使用另一个 ES2015 功能,称为 modules 。
您可能已经熟悉 AMD 模块或 commonJS 模块(由 Nodejs 使用)。好吧,ES6 / ES2015 为 JS 带来了一个标准——我们称它们为 ES6 模块,但它们现在是 JS 语言的一部分。一旦有了模块,就可以对私有函数和对象变量进行信息隐藏。请记住,只有您“导出”的内容对客户端调用代码可见。
让我们完成您的示例代码。这是第一个剪辑:
人.js
客户端.js
现在, getNameWithInitial 函数实际上是私有的,因为它没有被导出,所以 client.js 看不到它。
但是,对于 Person 类,我们仍然存在问题,因为它是导出的。目前你可以走到 manas 对象并做:
使用 _name 等属性,我们可以组合模块和 符号。这是 ES6+/ES2015 提供的一种强大而轻量级的信息隐藏技术。
Symbol 是一种新的内置类型。每个新的 Symbol 值都是唯一的。因此可以用作对象的键。
如果客户端调用代码不知道用于访问该密钥的符号,则他们无法获取它,因为该符号未导出。
让我们看看我们修改后的代码,使用符号和模块来隐藏类属性。
人.js
所以,现在客户不能只做:
因为 _name 没有被用作 name 值的键。
但是,符号是通过诸如 Object.getOwnPropertySymbols 之类的反射功能公开的,因此请注意,使用此技术它们并不是“完全”私有的。
外卖信息——模块通常是隐藏某些东西的好方法,因为如果不导出则不能在模块外部使用,并且与私有存储的符号一起用作键,那么类属性也可以隐藏(但不是严格私有的) ).今天使用模块可用于构建工具,例如。 webpack / browserify 和 babel。