是否可以将属性(使用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);
但是每次我想要获取/设置属性时,我仍然需要输入该变量的名称。
那么有没有办法创建一个
的属性答案 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)