将属性添加到节点文件

时间:2018-06-17 18:36:28

标签: javascript node.js properties this global

是否可以将属性(使用getset方法)添加到文件的范围而不使其成为全局? (类似于letconst对变量声明的工作方式)

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

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 个答案:

答案 0 :(得分:3)

应该在某些对象上访问属性,在JavaScript中省略对象的唯一可能性是全局属性和with语句。

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

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

console.log(PropertyValue);

另一种方法是使用with语句,该语句已被弃用,并且在严格模式下不起作用:

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将对其他模块可用。通常没有充分的理由将封装强制到开始使开发人员的生活更加困难的程度。如果不打算在模块外部使用PropertyValue,通常只需使用匈牙利符号并在内部/私有属性下划线即可:

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

这样,它仍然可以进行测试。

答案 1 :(得分:2)

如果要将变量范围限制为该文件,请仅使用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}

答案 2 :(得分:-1)

回答所有问题:

  
      
  1. 不是完全全局的。

  2.   
  3. 可以在不说明所有者对象的情况下进行访问。

  4.   
  5. 可以被eslint识别。

  6.   

是使用constlet语句。

根据const

的文档
  

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

根据let

的文档
  

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