无法设置属性。。。其中只有Getter(javascript es6)

无法设置属性。。。其中只有Getter(javascript es6),javascript,class,constructor,typeerror,getter-setter,Javascript,Class,Constructor,Typeerror,Getter Setter,所以我有一个简单的Javascript类 class MyClass { constructor(x) { this.x = x === undefined ? 0 : x; } get x() { return this.x; } } 创建MyClass时,我希望它的x设置为作为参数传入的值。在此之后,我不希望它能够被更改,因此我有意不创建set x()方法 然而,我想我一定是遗漏了一些基本的东西,因为这给了我“无法设置属性…

所以我有一个简单的Javascript类

class MyClass {
    constructor(x) {
        this.x = x === undefined ? 0 : x;
    }

    get x() {
        return this.x;
    }
}
创建MyClass时,我希望它的x设置为作为参数传入的值。在此之后,我不希望它能够被更改,因此我有意不创建set x()方法

然而,我想我一定是遗漏了一些基本的东西,因为这给了我“无法设置属性…它只有getter”错误


如何在不创建setter方法的情况下为x赋值

这里有几个问题

class MyClass 
{
    constructor(x) {
        this.x = x === undefined ? 0 : x;
    }

    get() {
        return this.x;
    } 

    set(x) { return this.x = x;}
}
当您通过
get x()
创建一个getter时,您正在导致
this.x
调用getter,由于您的
get x()
执行
this.x
,该getter将无限期地递归

将您对
this.x
的引用替换为
this.\u x
在此代码中,如下所示:

class MyClass {
    constructor(x) {
        this._x = x === undefined ? 0 : x;
    }

    get x() {
        return this._x;
    }
}

现在,您封装的
x
现在是
\ux
不会因为通过
this.x

调用getter而被混淆。如果您想在类定义中创建一个不可变属性
a
,使用JavaScript提供的方法,操作系统可以这样做(使用
Object.defineProperty()

class-MyClass{
构造器(x){
Object.defineProperty(这是“a”{
可枚举:false,
可配置:false,
可写:false,
值:x | |“空”
});
}
}
设o=newmyclass('Hello');
控制台日志(o.a);
o、 a='不会改变';

控制台日志(o.a)如果希望实例属性为只读,请将其设置为不可写:

class MyClass {
    constructor(x) {
        Object.defineProperty(this, "x", { value: x || 0 });
    }
}
一个属性可以是“简单”属性,就像过去的所有属性一样,也可以是getter/setter属性


当属性是getter/setter属性时,对该属性的所有引用都会通过getter或setter,包括从getter和setter函数中进行引用。因此,要存储属性,您需要使用替代属性名称或(更好的)符号实例。

您不能。属性必须是普通属性或getter/setter属性。(我认为;检查规范)您编写的代码也会失败,因为getter中对
this.x
的引用将被理解为对getter的函数调用,这意味着无限递归。谢谢!这正是我需要的!