创建类时我们希望部分属性不能被外部修改,即创建类的受保护属性。受保护属性可以在类以及子类中读取修改,而外部不能读取。
有以下三种方式实现私有属性:
下划线命名(掩耳盗铃)
将私有属性名称前增加下划线。这样写易读,但只防君子不防小人,外部仍可修改。
代码语言:javascript复制class Student {
constructor () {
this._nation = 'China'
}
}
复制代码
利用Symbol
利用Symbol基本数据类型保护属性。
有关Symbol的知识可见:developer.mozilla.org/zh-CN/docs/…
代码语言:javascript复制let NATION = new Symbol()
class Student {
constructor () {
this[NATION] = 'China'
}
}
复制代码
可以一次性保护多个属性:
代码语言:javascript复制let protectedItems = new Symbol()
class Student {
constructor () {
this[protectedItems] = {}
this[protectedItems].nation = 'China'
this[protectedItems].skill = 'JavaScript'
}
}
复制代码
这样写防小人,但不防特别坏的小人,可以通过Object.getOwnPropertySymbols()方法获取被Symbol保护的属性。如下所示,在外部对保护属性进行了修改。
代码语言:javascript复制let aki = new Student()
let nation = Object.getOwnPropertySymbols(aki)[0]
nation = 'England'
复制代码
利用WeakMap
利用WeakMap类保护属性。
有关WeakMap的知识可见:developer.mozilla.org/zh-CN/docs/…
代码语言:javascript复制let map = new WeakMap()
class Student {
constructor () {
//以this为key,被保护的属性值为value,存入WeakMap中
map.set(this, 'China')
}
}
复制代码
同样可以一次性保护多个属性:
代码语言:javascript复制let protectedItems = new WeakMap()
class Student {
constructor () {
//以this为key,被保护属性组成的对象为value,存入WeakMap中
protectedItems.set(this, {
nation: 'China',
skill: 'JavaScript'
})
}
}
复制代码
这样写最安全,但缺点是继承时子类也无法访问,保护属性变为了私有属性。不仅防了所有小人还防了自己所有后代分遗产。