gpt4 book ai didi

javascript - 将 javascript 类实例限制为特定属性

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:39:34 25 4
gpt4 key购买 nike

我想定义一个类的结构,如果用户试图使用类中未定义的属性在我的一个对象实例上设置属性,则抛出错误。

例如,假设我有以下类(class):

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关键字似乎接近我想要的。它会阻止添加新属性,但我想抛出异常以防用户输入有效的属性名称。

更新:在严格模式下使用 Object.preventExtensionsObject.sealObject.freeze 将不存在的属性分配给对象。

最佳答案

您可以使用 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()。尝试添加新属性将在严格模式下抛出错误:

'use strict';
class MyClass {
constructor() {
this.propertyA = 'A value';
this.propertyB = 'Another value';
Object.preventExtensions(this);
}
}

let myInstance = new MyClass();
myInstance.propertyA = 'a new value';
console.log('About to add propertyC');
myInstance.propertyC = 'unknown property value';

关于javascript - 将 javascript 类实例限制为特定属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52001178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com