代码之家  ›  专栏  ›  技术社区  ›  nick zoum

向节点文件添加属性

  •  5
  • nick zoum  · 技术社区  · 6 年前

    是否可以添加属性(使用 get set 方法)在不使其全局化的情况下将其设置为文件的作用域?(类似于 let const 对变量声明有效)

    这是我到目前为止编写的代码,它可以将属性添加到全局范围。

    var propertyValue;
    
    Object.defineProperty(global, "PropertyValue", {
        get: function () {
            return propertyValue;
        },
        set: function (value) {
            propertyValue = value;
        }
    });
    
    console.log(PropertyValue);
    

    是否可以使该属性仅对在中声明的文件可见。同样的事情也可以通过声明一个变量并在其中添加所有属性来完成。

    var fileProperties;
    var propertyValue;
    
    Object.defineProperty(fileProperties, "PropertyValue", {
        get: function () {
            return propertyValue;
        },
        set: function (value) {
            propertyValue = value;
        }
    });
    
    console.log(fileProperties.PropertyValue);
    

    但是,每次我想要获取/设置属性时,仍然需要键入该变量的名称。

    那么有没有办法创建一个

    1. 不是完全全球化的
    2. 可以在不声明所有者对象的情况下访问
    3. 可以被eslint识别
    3 回复  |  直到 6 年前
        1
  •  3
  •   Estus Flask    6 年前

    属性应该在某个对象上被访问,javascript中对象被忽略的唯一可能是全局属性和 with 语句。

    如原始代码所示,这将访问全局变量的属性,对本地任务使用全局变量是一种不好的做法,对本地任务使用全局变量是一种不好的做法:

    Object.defineProperty(global, "PropertyValue", {...});
    
    console.log(PropertyValue);
    

    另一种方法是 具有 语句,已弃用且在严格模式下不起作用:

    Object.defineProperty(someObject, "PropertyValue", {...});
    
    with (someObject) {
      console.log(PropertyValue);
    }
    

    在node中,脚本在 module wrapper function , this.PropertyValue module.exports.PropertyValue 在模块范围内。

    可以在导出对象上显式定义属性:

    let propertyValue;
    
    Object.defineProperty(exports, "PropertyValue", {
        get: function () {
            return propertyValue;
        },
        set: function (value) {
            propertyValue = value;
        }
    });
    
    console.log(exports.PropertyValue);
    

    PropertyValue 将在导入此模块时对其他模块可用。通常没有充分的理由强制封装到使开发人员的生活变得更困难的程度。如果 属性值 不打算在模块外部使用,通常只需使用匈牙利符号和下划线内部/私有属性即可:

    Object.defineProperty(exports, "_PropertyValue", { ... });
    

    这样它仍然可以测试。

        2
  •  2
  •   Vikash_Singh    6 年前

    如果希望变量的范围仅限于该文件,请使用 this 而不是 global

    var propertyValue;
    
    Object.defineProperty(this, "PropertyValue", {
        get: function () {
            return propertyValue;
        },
        set: function (value) {
            propertyValue = value;
        }
    });
    
    console.log(this.PropertyValue); // prints undefined
    
    propertyValue={a:1}
    console.log(this.PropertyValue) // prints {a:1}
        3
  •  -1
  •   Benjie Wheeler    6 年前

    回答你所有的问题:

    1. 不是完全全球化的。

    2. 可以在不声明所有者对象的情况下访问。

    3. 可以被eslint识别。

    是使用 const let 声明。

    const

    常量是块范围的,很像使用let语句定义的变量。常量的值不能通过重新分配而更改,也不能重新声明。

    let

    let语句声明块作用域局部变量,可以选择将其初始化为值。