Comment implémenter des restrictions d'accès sur les attributs de la classe class en JavaScript ?
statique
En JavaScript, le mot-clé static est utilisé pour définir des propriétés statiques ou des méthodes statiques ;
il permet de manipuler certaines variables et méthodes globalement à travers la classe elle-même
// 示例代码
class Prent {
static age = 99;
// 静态方法
static getAge() {
console.log(this.age);
}
}
Prent.getAge();
console.log(Prent.age)
public
Comment définir une propriété publique afin que l'intérieur et l'extérieur de la classe et des sous-classes héritées soient accessibles ?
Très simple, généralement défini dans la classe est la propriété publique
// 示例代码
class Prent {
constructor(name) {
// 公共属性
this.name = name || 'xiao';
}
// 公共方法
getName() {
// 内部访问
console.log(this.name)
}
}
const p = new Prent();
// 外部访问
p.getName();
console.log(p.name)
class Son extends Prent {
}
const s = new Son();
// 子类访问
s.getName();
console.log(s.name)
protégé
Créer une classe pour protéger ses propriétés internes, rendant l'extérieur inaccessible, seules la classe actuelle et ses sous-classes peuvent accéder
et définir ses propriétés internes via des getters et des setters
// 内部对属性进行保护,使外部不能进行访问
// 方式一
const HOST = Symbol("host")
// 方式二
const HOSTWEAKMAP = new WeakMap();
class Prent {
constructor() {
// 属性保护,只能当前类和子类能够访问
this[HOST] = 'www.baidu.com';
HOSTWEAKMAP.set(this, 'www.qq.com');
}
get host() {
return this[HOST]
}
get hostweak() {
return HOSTWEAKMAP.get(this);
}
}
const p = new Prent();
console.log(p.host)
console.log(p.hostweak)
class Son extends Prent {
}
const s = new Son();
console.log(s.host)
console.log(s.hostweak)
privé
La création de propriétés privées à l'intérieur d'une classe ne peut être utilisée qu'en interne, et ni les classes externes ni les sous-classes ne peuvent y accéder.
Nous pouvons utiliser # pour déclarer des propriétés privées
class Prent {
// 私有属性
#name = "456xxx";
// 私有方法
#getName() {
console.log(this.#name)
}
// 公共方法
getName() {
this.#getName();
}
}
const p = new Prent();
p.getName();
// 访问将会报错 Property '#getName' is not accessible outside class 'Prent' because it has a private identifier.
// p.#getName();
class Son extends Prent {
}
const s = new Son();
// 子类只能通过父类暴露公共方法来访问其内部私有属性
s.getName();