如何创建具有不可变属性的javascript类

时间:2018-02-07 23:40:04

标签: javascript class properties immutability

这个问题专门用于防止将不需要的属性添加到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但不确定它们如何应用于类。

2 个答案:

答案 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);