【发布时间】:2015-08-29 06:54:57
【问题描述】:
我是 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});
}
还有其他方法吗?
【问题讨论】:
-
使用上述方法,您无法为
username或email设置任何值。它们将始终为undefined,因为您已将它们设为只读且未为其分配值。 -
@T.J.Crowder 我确实在 defineProperty 通过构造函数运行之前为它们分配了一个值,然后它变得不可写。
-
好吧,只要他们在
props... -
@T.J.Crowder:这似乎是预期的用法。我看不出有什么问题。
-
虽然回答正是我所要求的,但我认为我没有很好地表达这个问题。我一直在寻找 Javascript 中是否存在一种模式,使对象的行为更像静态类型的 OOP 语言,除了类创建者想要的成员之外,您不能添加其他成员。对象密封不允许我们添加新属性,但如果它在“允许”列表中,我想添加一个。我应该为它提出一个新问题吗?
标签: javascript schema ecmascript-6