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

ben*_*ime 3 javascript

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

例如,假设我有以下课程:

class MyClass {
  constructor() {
    this.propertyA = 'A value';
    this.propertyB = 'Another value';
  }
}
Run Code Online (Sandbox Code Playgroud)

然后当用户修改对象实例时......

let myInstance = new MyClass();
myInstance.propertyA = 'a new value'; // would work fine
myInstance.propertyC = 'unknown property value'; // throw exception
Run Code Online (Sandbox Code Playgroud)

这可能吗?该密封关键字似乎是接近我想要的东西.它会阻止添加新属性,但我想在用户输入-o是有效属性名称时抛出异常.

更新: 使用Object.preventExtensions,, Object.sealObject.freeze在严格模式下,如果将不存在的属性分配给对象,则会导致错误.

Cer*_*nce 6

您可以使用a 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
Run Code Online (Sandbox Code Playgroud)

可以使用防止添加新属性的更加简单的方法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';
Run Code Online (Sandbox Code Playgroud)