Javascript 在类构造函数中计算并定义常量

Javascript 在类构造函数中计算并定义常量,javascript,ecmascript-6,Javascript,Ecmascript 6,如果常数的值是纯常数,则很容易定义它: class Foo { static get bar() { return 123; } } 但是,如果我需要定义一个需要在构造函数中计算的常量,该怎么办 class Foo { constructor(m) { // ... } } let test = new Foo(10); console.log(test.bar); // OK test.bar = 1; // ERROR 如何在构造函数中定义

如果常数的值是纯常数,则很容易定义它:

class Foo {
    static get bar() { return 123; }
}
但是,如果我需要定义一个需要在构造函数中计算的常量,该怎么办

class Foo {
  constructor(m) {
    // ...
  }
}

let test = new Foo(10);
console.log(test.bar);  // OK
test.bar = 1;           // ERROR
如何在构造函数中定义
bar
,并使该条作为常量可访问


在其他方法中,该常数的值需要多次使用。这个常量值的计算并不简单,因此每次需要时计算它都会浪费资源。另一方面,我想确保它一旦计算出来就不能更改。

这个怎么样

class Foo {
    constructor (m) {
        this._bar = m + 10; // this is _bar , not bar
    }

    get bar() {
        return this._bar; //_bar is the private methods, which is different from bar
    }
}


const foo = new Foo(1);
console.log(foo.bar) // return 11
foo.bar =  0
console.log(foo.bar) // still return 11
这个怎么样

class Foo {
    constructor (m) {
        this._bar = m + 10; // this is _bar , not bar
    }

    get bar() {
        return this._bar; //_bar is the private methods, which is different from bar
    }
}


const foo = new Foo(1);
console.log(foo.bar) // return 11
foo.bar =  0
console.log(foo.bar) // still return 11
更新 根据评论中的讨论,只需在传递给的配置中设置
属性,而不是
get
属性,就可以更清晰地实现这一点;由于
可写
可配置
属性默认为
,这足以提供问题中概述的所需行为:

class-Foo{
建造师(m){
这个,m=m;
常数棒=m*100;
defineProperty(这个'bar',{value:bar});
}
}
let test=新的Foo(10);
控制台日志(test.bar);
试验压力=300巴;
控制台日志(test.bar);
删除test.bar;
控制台日志(test.bar)更新
根据评论中的讨论,只需在传递给的配置中设置
属性,而不是
get
属性,就可以更清晰地实现这一点;由于
可写
可配置
属性默认为
,这足以提供问题中概述的所需行为:

class-Foo{
建造师(m){
这个,m=m;
常数棒=m*100;
defineProperty(这个'bar',{value:bar});
}
}
let test=新的Foo(10);
控制台日志(test.bar);
试验压力=300巴;
控制台日志(test.bar);
删除test.bar;
控制台日志(test.bar)您可以检查此项

class-Foo{
构造函数(值){
这个._privateValue=值;
}
get bar(){
返回此值。\u privateValue;
}
设置栏(val){
console.error(“对不起,无法编辑我;)”)
}
}
常量测试=新的Foo(10)
console.log(test.bar)
test.bar=20;
console.log(test.bar)
您可以对此进行检查

class-Foo{
构造函数(值){
这个._privateValue=值;
}
get bar(){
返回此值。\u privateValue;
}
设置栏(val){
console.error(“对不起,无法编辑我;)”)
}
}
常量测试=新的Foo(10)
console.log(test.bar)
test.bar=20;

console.log(test.bar)
这不是对原始问题的回答,但您能否将计算结果作为一种解决方法进行记忆?@AlexanderNied-将其存储到变量中?变量可以更改。这不是一个解决方案。这不是对原始问题的回答,但你能将计算结果作为一种解决方法记忆起来吗?@AlexanderNied-将其记忆到一个变量中?变量可以更改。这不是解决办法,谢谢。这是不是真的需要
set
呢?好问题。我不认为这是必需的,尽管可能有一些linter会让你对它大发雷霆。如果getter返回一个常量值而不计算任何东西,那么使用getter有什么意义呢?@Thomas it满足了问题的要求:它允许读,但不允许写,并且不需要重复进行相同的计算。我在例子中的计算是微不足道的,但是Ωmega的用例计算显然相当昂贵。除非我误解了你的反对意见或其他更好的解决方案,但你可以用一个值,而不需要一个getter。我不太明白。您可以使用一个值作为实例属性使其可用,但也可以对其进行更改,这是什么Ω梅加试图避免。如果我遗漏了一些明显的东西,我深表歉意——也许您可以提供一个JSFIDLE来说明您的观点?谢谢。这是不是真的需要
set
呢?好问题。我不认为这是必需的,尽管可能有一些linter会让你对它大发雷霆。如果getter返回一个常量值而不计算任何东西,那么使用getter有什么意义呢?@Thomas it满足了问题的要求:它允许读,但不允许写,并且不需要重复进行相同的计算。我在例子中的计算是微不足道的,但是Ωmega的用例计算显然相当昂贵。除非我误解了你的反对意见或其他更好的解决方案,但你可以用一个值,而不需要一个getter。我不太明白。您可以使用一个值作为实例属性使其可用,但也可以对其进行更改,这是什么Ω梅加试图避免。如果我遗漏了一些明显的内容,我很抱歉——也许您可以提供一个JSFIDLE来说明您的观点?因此您有一个公共“私有属性”和一个公共getter来返回另一个属性的值。因此您有一个公共“私有属性”和一个公共getter来返回另一个属性的值。