这个问题专门用于防止将不需要的属性添加到javascript"类"中。我有一个名为Animal的课程。
function Animal(){
this.name="";
this.type="";
//20 other properties
}
用户创建自己的Animal并添加20个属性的最简单方法是什么。我还希望防止用户意外添加不正确的属性。
我目前的方法:
var myAnimal= new Animal();
myAnimal.name="fluffy";
myAnimal.type="cat";
myAnimal.typo="cat";
//再添加20个属性需要输入myAnimal 20次 此外,如果用户输入拼写错误,则会将其添加为新属性。
我希望会有这样的事情:
myAnimal=new Animal{
name:"fluffy",
type:"cat";
typo:"cat" //would throw an error
}
我查看了Object.freeze Object.seal,Object.preventExtensions但不确定它们如何应用于类。
答案 0 :(得分:4)
您可以在构造函数的末尾Object.seal(this)
来阻止添加新属性:
function Animal() {
this.name = "";
this.type = "";
// 20 other properties
Object.seal(this);
}
您可以在构造函数中获取具有初始值的对象:
function Animal(initial) {
this.name = "";
this.type = "";
// 20 other properties
Object.seal(this);
Object.assign(this, initial);
}
像这样使用:
myAnimal = new Animal({
name: "fluffy",
type: "cat",
typo: "cat",
});
缺点是错误不直接指向typo
,就像使用多个赋值语句一样。
答案 1 :(得分:2)
您可以使用Proxy为此。
您可以设置自定义setter,当obj没有该属性时会抛出错误。
您也可以使用get
执行相同操作,因为不会导致错误导致undefined
错误。
function Animal() {
this.name = "";
this.type = "";
return new Proxy(this, {
set: function(obj, prop, value) {
if (!obj.hasOwnProperty(prop))
{
throw Error("I don`t have this property: " + prop);
}
obj[prop] = value;
}
});
}
var cat = new Animal();
console.log(cat);
cat.name = "Rita";
console.log(cat);
cat.nama = "Rata";
console.log(cat);