在类构造函数中定义一个常量(ES6)

15

我能否在类的构造函数中定义一个 const 常量?

我尝试过以下方法:

class Foo {
    constructor () {
        const bar = 42;
    }

    getBar = () => {
        return this.bar;
    }
}

但是

var a = new Foo();
console.log ( a.getBar() );

返回undefined。


1
@Bergi 这与我所问的根本不相似。 - alexandernst
好的,它解释了变量和属性之间的区别,这似乎是您遇到的问题。不可否认,它没有告诉您如何定义不可写属性。 - Bergi
3个回答

31

您可以使用静态只读属性来声明作用于类的常量值。

class Foo {
    static get BAR() {
        return 42;
    }
}

console.log(Foo.BAR); // print 42.
Foo.BAR = 43; // triggers an error

1
实际上,=> 不应该在那里。 - alexandernst
@alexandernst 谢谢。 - Reactgular
1
JS非常绕弯。 - Niki Romagnoli

8

仅在构造函数中定义一个常量不会将其附加到实例上,您必须使用this来设置它。我猜想您想要不可变性,因此可以使用getter

class Foo {
    constructor () {
        this._bar = 42;
    }

    get bar() {
        return this._bar;
    }
}

然后您可以像平常一样使用它:

const foo = new Foo();
console.log(foo.bar) // 42
foo.bar = 15;
console.log(foo.bar) // still 42

在尝试更改bar时,这不会引发错误。如果您想要,在setter中可以引发错误:

class Foo {
    constructor () {
        this._bar = 42;
    }

    get bar() {
        return this._bar;
    }

    set bar(value) {
        throw new Error('bar is immutable.');
    }
}

0
问题出在 "bar" 的作用域 - 它被限制在构造函数内部:
'use strict';

class Foo {
    constructor () {
        const bar = 42;
        this.bar = bar; // scoping to the class 
    }

    getBar () {
      return this.bar;
    }
}

var a = new Foo();
console.log ( a.getBar() );

啊,我明白了。这样做可以保持const的属性,对吧? - alexandernst
1
@alexandernst - 不,this.bar不会是一个常量,它可以被覆盖。 - adeneo
1
那如果const不能在类中使用,它到底有什么意义呢? - alexandernst
1
我正在撰写另一个答案,可能更接近您想要的内容... - silvenon
@alexandernst const 关键字是 var 的不可变版本,具有与 var 相同的作用域问题。 - Reactgular
你可以创建一个不可写的属性,就像这个一样,它不能在对象内被重写,但是返回的原始值42仍然可以被重写。 - adeneo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接