- 使用
super
关键字:
- 在 JavaScript 中,当子类继承父类时,通过
super
关键字调用父类的构造函数,可以确保父类的安全敏感初始化操作得以执行。
- 示例代码如下:
class Parent {
constructor() {
// 模拟安全敏感的初始化操作,比如设置安全标志
this.securityFlag = true;
}
}
class Child extends Parent {
constructor() {
// 调用父类构造函数
super();
// 子类自己的初始化操作,不会破坏父类的安全机制
this.childProperty = 'child value';
}
}
let child = new Child();
console.log(child.securityFlag); // true
console.log(child.childProperty); // 'child value'
- 避免在子类构造函数中过早修改父类属性:
- 确保在调用
super()
之后再进行子类特有的操作,防止在父类初始化完成之前干扰父类的安全敏感设置。
- 例如,如果在
super()
调用之前尝试修改父类可能使用的属性,可能会导致安全机制被破坏。
class AnotherParent {
constructor() {
this.sensitiveData = 'protected data';
}
}
class AnotherChild extends AnotherParent {
constructor() {
// 错误示范,在调用super之前访问或修改可能会影响父类安全机制的属性
// this.sensitiveData = 'tampered data';
super();
// 正确做法,在super调用之后进行子类操作
this.otherData = 'new data';
}
}
- 封装和访问控制:
- 在父类中,使用闭包或
WeakMap
等技术来封装安全敏感的数据,使其对子类不可直接访问和修改。
- 例如,使用
WeakMap
来存储敏感数据:
const privateData = new WeakMap();
class EncapsulatedParent {
constructor() {
const sensitiveInfo = 'confidential';
privateData.set(this, sensitiveInfo);
}
getSensitiveInfo() {
return privateData.get(this);
}
}
class EncapsulatedChild extends EncapsulatedParent {
constructor() {
super();
// 子类无法直接访问或修改父类的敏感数据
}
}
let encapsulatedChild = new EncapsulatedChild();
console.log(encapsulatedChild.getSensitiveInfo()); // 'confidential'