JavaScript 行为类似于函数的变量

JavaScript variable that behaves like a function

是否可以创建一个链接到函数的变量,并在每次读取该变量时执行该函数?当对某个翻译的调用已经发生时(返回一个将来可能会更改的翻译字符串),用例将更新语言翻译。这有点类似于 class 的 getter 方法,但实际上没有定义 class.

知道如何做到这一点(如果有的话)吗?

您可以使用 Object.defineProperty() 来做到这一点

Object.defineProperty(this, 'prop', { // adding to whatever "this" context is
  get: () => Math.random()
})

console.info('prop get #1', prop)
console.info('prop get #2', prop)

一个选择是利用 global 对象可以在其上定义隐式范围内的属性这一事实。在网络浏览器中,Window 对象是 global 对象,因此:

<script>
var foo = 123;

function bar() { console.log( foo ) };
bar();
</script>

同理:

<script>
document.window.foo = 123;

function bar() { console.log( foo ) };
bar();
</script>

是否(或多或少)与此相同:

<script>
Object.defineProperty( window, "foo", { value: 123 } );

function bar() { console.log( foo ) };
bar();
</script>

因此我们可以滥用 Object.defineProperty 来获得您想要的效果,但需要注意的是它不会在 JavaScript 范围内工作,其中 global 的属性不可访问。

<script>
function createMagicVariable( name, func ) {

    var propDef = {
        get: func
    };
    Object.defineProperty( window, name, propDef );
}
</script>

这样使用:

<script>

function getRandom() { return Math.random(); }

createMagicVariable( 'foo', getRandom );

console.log( foo );
console.log( foo );
console.log( foo );

</script>