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

tec*_*dog 2 javascript properties class immutability

这个问题专门用于防止将不必要的属性添加到javascript“类”中。我有一堂课叫做动物。

function Animal(){
this.name="";
this.type="";
//20 other properties
}
Run Code Online (Sandbox Code Playgroud)

用户创建自己的动物并添加20个属性的最简单方法是什么。我还想防止用户意外添加错误的属性。

我目前的方法:

    var myAnimal= new Animal();
    myAnimal.name="fluffy";
    myAnimal.type="cat";
    myAnimal.typo="cat";
Run Code Online (Sandbox Code Playgroud)

//添加20个以上的属性将需要再输入myAnimal 20次,而且如果用户输入错误,则会将其添加为新属性。

我希望会有这样的事情:

myAnimal=new Animal{
name:"fluffy",
type:"cat";
typo:"cat" //would throw an error
}
Run Code Online (Sandbox Code Playgroud)

我已经研究了Object.freeze Object.seal,Object.preventExtensions,但不确定它们如何应用于类。

Ry-*_*Ry- 5

您可以Object.seal(this)在构造函数的末尾防止添加新属性:

function Animal() {
    this.name = "";
    this.type = "";
    // 20 other properties
    Object.seal(this);
}
Run Code Online (Sandbox Code Playgroud)

您可以在构造函数中使用具有初始值的对象:

function Animal(initial) {
    this.name = "";
    this.type = "";
    // 20 other properties
    Object.seal(this);
    Object.assign(this, initial);
}
Run Code Online (Sandbox Code Playgroud)

像这样使用:

myAnimal = new Animal({
    name: "fluffy",
    type: "cat",
    typo: "cat",
});
Run Code Online (Sandbox Code Playgroud)

缺点是错误不会直接指向,typo就像您使用多个赋值语句那样。