如何在ES6中强制执行严格的类模式

时间:2015-08-28 16:21:22

标签: javascript schema ecmascript-6

我是es6的新手,我想知道这种方法是否正常。我不希望有人在我的对象上设置我不想要的属性。

export default class User {

static getMembers() {
    return ['username','email','fullname','birthdate'];
}

constructor(props) {
    Object.keys(props).forEach((p)=>{
        if (User.getMembers().includes(p)) this[p]=props[p]
    });
    Object.defineProperty(this,"username",{writable:false});
    Object.defineProperty(this,"email",{writable:false});
}

任何其他方法?

1 个答案:

答案 0 :(得分:2)

如图所示,您无法为usernameemail设置任何值。它们始终是undefined,因为您已将它们设为只读,并且无法为它们分配值。您还没有做任何事情来阻止访问这些对象之一的代码设置一个完全任意的属性:

let u = new User();
x.anythingIWant = 42;

如果您想阻止代码向对象添加属性,可以使用Object.seal(参考:MDNspec)执行此操作,这会阻止添加新属性并使无法重新定义现有属性。所以:

export default class User {
    constructor() {
        // ...create your desired properties

        // Seal the object
        Object.seal(this);
    }
}

如果您还希望将usernameemail设为只读,那么您还可以包含{{1>}之前的<{em> Object.defineProperty)。只需确保首先为其分配值,因为一旦完成了Object.sealdefineProperty,就无法再对它们进行更改。

我认为通过循环遍历数组,我可能会略微区别地使用那些列入白名单的属性。

所以:

Object.seal