我想定义一个类的结构,如果用户尝试使用该类中未定义的属性尝试在我的一个对象实例上设置一个属性,则会引发错误。
例如,说我有以下课程:
class MyClass {
constructor() {
this.propertyA = 'A value';
this.propertyB = 'Another value';
}
}
然后当用户修改对象实例时...
let myInstance = new MyClass();
myInstance.propertyA = 'a new value'; // would work fine
myInstance.propertyC = 'unknown property value'; // throw exception
这可能吗? seal关键字似乎与我想要的很接近。这样可以防止添加新属性,但是如果用户键入-o是有效的属性名称,我想抛出异常。
更新:
如果将不存在的属性分配给对象,则在严格模式下使用Object.preventExtensions
,Object.seal
或Object.freeze
会导致错误。
答案 0 :(得分:6)
您可以使用otherclass.mro()
来拦截添加的新属性并阻止定义新属性:
Proxy
阻止class MyClass {
constructor() {
this.propertyA = 'A value';
this.propertyB = 'Another value';
return new Proxy(this, {
get: (_, prop) => this[prop],
set: (_, prop, value) => {
if (!(prop in this)) throw new Error('Prop does not exist!');
this[prop] = value;
}
});
}
}
let myInstance = new MyClass();
myInstance.propertyA = 'a new value'; // would work fine
console.log('about to set propertyC:');
myInstance.propertyC = 'unknown property value'; // throw exception
添加新属性的更麻烦的方法。尝试添加新属性将在严格模式下引发错误:
Object.preventExtensions()