是否可以将属性(使用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);
但是每次我想要获取/设置属性时,我仍然需要输入该变量的名称。
那么有没有办法创建一个属性
应该在某个对象上访问属性,在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", { ... });
这样它仍可用于测试。
如果您希望变量范围仅限于该文件,请仅使用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}