gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 15:45:00 25 4
gpt4 key购买 nike

我是 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});
}

还有其他方法吗?

最佳答案

使用所示代码,您无法为用户名电子邮件设置任何值。它们将始终是未定义,因为您已将它们设置为只读并且未为其分配值。您还没有采取任何措施来阻止代码访问这些对象之一并设置完全任意的属性:

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);
}
}

如果您还想将用户名电子邮件设置为只读,您还需要包含您拥有的Object.defineProperty调用(Object.seal之前)。只需确保首先为它们分配值,因为一旦完成 definePropertyObject.seal,您就无法再更改它们。

我想我可能会以稍微不同的方式使用该白名单属性数组,只需循环访问该数组即可。

所以:

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

constructor(props) {
// Create the properties
User.getMembers().forEach((name) => { this[name] = props[name]; });

// Make sure username and email have a value, because we won't
// be able to change it in a moment
// ...

// Make username and email read-only
Object.defineProperty(this, "username", {writeable: false});
Object.defineProperty(this, "email", {writeable: false});

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

关于javascript - 如何在 ES6 中强制执行严格的类模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32275599/

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