JavaScript 行为类似于函数的变量
JavaScript variable that behaves like a function
是否可以创建一个链接到函数的变量,并在每次读取该变量时执行该函数?当对某个翻译的调用已经发生时(返回一个将来可能会更改的翻译字符串),用例将更新语言翻译。这有点类似于 class 的 get
ter 方法,但实际上没有定义 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>
是否可以创建一个链接到函数的变量,并在每次读取该变量时执行该函数?当对某个翻译的调用已经发生时(返回一个将来可能会更改的翻译字符串),用例将更新语言翻译。这有点类似于 class 的 get
ter 方法,但实际上没有定义 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>