使用Symbol创建私有属性
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
属性。
如果您觉得本文对您有用,欢迎捐赠或留言~
- 本博客所有文章除特别声明外,均可转载和分享,转载请注明出处!
- 本文地址:https://www.leevii.com/?p=1268