类的受保护属性

2021-10-08 11:28:29 浏览数 (2)

创建类时我们希望部分属性不能被外部修改,即创建类的受保护属性。受保护属性可以在类以及子类中读取修改,而外部不能读取。

有以下三种方式实现私有属性:

下划线命名(掩耳盗铃)

将私有属性名称前增加下划线。这样写易读,但只防君子不防小人,外部仍可修改。

代码语言: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'
        })
    }
}
复制代码

这样写最安全,但缺点是继承时子类也无法访问,保护属性变为了私有属性。不仅防了所有小人还防了自己所有后代分遗产。

0 人点赞