如何在ES6类中创建私有变量和方法?

时间:2015-07-21 22:54:24

标签: javascript oop variables methods ecmascript-6

如何使用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
    }

}

5 个答案:

答案 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]调用你的属性。这是使您的属性成为某种私有属性的方法。但是这种语法并没有提供真正的隐私。