es6类中没有提供私有属性、私有方法这些概念,之前的写法,使用下划线表示一个方法是私有的,但是,在外部仍然是可以被访问到的,并没有起到真正私有的目的。
var Person = (function () {
function Person (name, age) {
this.name = name;
this.age = age;
}
Person.prototype.getAge = function () {
return this.age;
}
Person.prototype._setAge = function (age) {
this.age = age
}
return Person;
})();
这里的_setAge
只是起到了说明私有的目的,并不能真正的私有化。
在es6中引入了Symbol
,表示独一无二的值,我们可以使用它来实现属性和方法的私有化。
const [setName, setAge] = [Symbol('setName'), Symbol('setAge')],
privateData = new WeakMap()
class Person {
constructor (name, age) {
privateData.set(this, { name, age })
}
[setName] (name) {
privateData.get(this).name = name
}
[setAge] (age) {
privateData.get(this).age = age
}
getAge () {
return privateData.get(this).age
}
getName () {
return privateData.get(this).name
}
}
export default Person
上面的Person
类中,setName
和setAge
就是私有的方法,在类的内部,我们可以自由调用,例如在getAge
之前,总是设置age
值为12
可以如下方式调用。
getAge () {
this[setAge](12)
return privateData.get(this).age
}
但是,在外部,是无法进行调用的,正是因为每一个Symbol
的值都是唯一的这一特性,所以无法访问类内部创建的Symbol
属性。
如果觉得我的文章对您有用,请您随意打赏。您的支持将鼓励我更加努力创作!
如无特殊声明,文章均为原创,若有不正之处,万望告知。转载请附上原文地址,十分感谢!