将属性添加到节点文件

问题描述 投票:5回答:3

是否可以将属性(使用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识别
javascript node.js properties this global
3个回答
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", { ... });

这样它仍可用于测试。


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}

-1
投票

答案你的所有问题:

  1. 不完全全球化。
  2. 可以在不声明所有者对象的情况下访问。
  3. 可以通过eslint识别。

是使用constlet声明。

来自const的文档

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

来自let的文档

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

© www.soinside.com 2019 - 2024. All rights reserved.