如何使用ES6类创建私有变量和方法,这些变量和方法应该由同一个类的公共方法访问。
class MyClass {
constructor() {
this.publicVar = "I am public";
//some private Variable e.g privteVar1 = "I am Private1"; privateVar2 = "I am Private2";
this.publicMethod = () => {
//it should have accesses to private variables and methods
console.log(privateVar1, privateVar2)
};
//similarly need to create some privateMethod
}
render() {
//it also should have access to the private variables
}
}
答案 0 :(得分:2)
使用var
/ let
/ const
将其设为本地变量,并且可以通过您定义的所有特权方法关闭它在你的构造函数中。这并没有改变ES5,顺便说一句。
class MyClass {
constructor() {
this.publicVar = "I am public";
const privteVar1 = "I am Private1",
const privateVar2 = "I am Private2";
this.publicMethod = () => {
// it has access to private variables
console.log(privateVar1, privateVar2)
};
}
}
请注意,这些变量是构造函数的本地变量,因此您无法从原型方法中访问它们,因为那些需要公共属性或复杂的变通方法。
答案 1 :(得分:2)
正如@yibuyisheng所注意到的,您可以使用符号来创建对属性的无法访问的引用。您也可以创建私有方法。
var privateMethod = Symbol('private');
class SomeClass {
constructor() {
}
[privateMethod]() {
// some private actions
}
render() {
// call private method
this[privateMethod]()
}
}
Symbol创建一个唯一引用,它可以用作属性名称。并且只能通过使用它来调用此属性或方法。这是可能的,因为ES6引入了computed properties syntax,您可以使用变量进行动态属性定义。
如果您没有为其他人公开此符号,则只能拨打该号码。
答案 2 :(得分:1)
您可以使用Symbol
来实现它:
var privateSymbol = Symbol('private');
class SomeClass {
constructor() {
this.setPrivateValue('some init value');
}
setPrivateValue(value) {
this[privateSymbol] = value;
}
getPrivateValue() {
return this[privateValue];
}
}
请注意,将以前的代码放在某个模块中,不要公开privateSymbol
。
答案 3 :(得分:0)
在JS中获得真正隐私的唯一方法是通过范围界定,因此无法拥有只能在组件内部访问的this
成员的属性。在ES6中存储真正私有数据的最佳方法是使用WeakMap。
const privateProp1 = new WeakMap();
const privateProp2 = new WeakMap();
class MyClass {
constructor() {
privateProp1.set(this, "I am Private1");
privateProp2.set(this, "I am Private2");
this.publicVar = "I am public";
this.publicMethod = () => {
console.log(privateProp1.get(this), privateProp2.get(this))
};
}
render() {
//it also should have access to the private variables
console.log(privateProp1.get(this));
}
}
答案 4 :(得分:-4)
试试这个:
var myString = "Hello"
let charactersArray = Array(myString.characters)
像这样[myPrivate]调用你的属性。这是使您的属性成为某种私有属性的方法。但是这种语法并没有提供真正的隐私。