代码之家  ›  专栏  ›  技术社区  ›  orange

行为类似于函数的JavaScript变量

  •  1
  • orange  · 技术社区  · 6 年前

    是否可以创建链接到函数的变量,并在每次读取变量时执行此函数?当对某个翻译的调用已经发生时(返回一个将来可能会改变的翻译字符串),用例将被更新为语言翻译。这有点像 get

    知道怎么做吗(如果有的话)?

    1 回复  |  直到 6 年前
        1
  •  6
  •   Phil    6 年前

    你可以用 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)
        2
  •  1
  •   Dai    6 年前

    一种选择是利用 global Window 对象是 全球的

    <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范围内不起作用 全球的 的属性不可访问。

    <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>