我在Javascript中有一个“singleton”类,声明如下:
ExpressionValidator =
{
// A map of function names to the enumerated values that can be passed to it.
functionParamValues:
{
"Func1": ["value1", "value2", "value3"],
"Func2": ["value1", "value2", "value3"]
}
}
我想以某种方式定义["value1", "value2", "value3"]
的数组,使得它不需要在任何需要的地方复制 - 但我无法弄清楚如何使其工作。< / p>
我目前的想法是这样的:
ExpressionValidator =
{
// An array of possible values to use as parameters to certain functions.
values:
[
"value1",
"value2",
"value3"
],
// A map of function names to the enumerated values that can be passed to it.
functionParamValues:
{
"Func1": values
"Func2": values
}
}
但这不起作用,因为它在尝试初始化values
对象的“Func1”和“Func2”属性时找不到functionParamValues
数组。我还尝试使用this.values
而不仅仅是values
,但它最终为null
,因此我假设它正在尝试获取values
对象的functionParamValues
属性,不是父ExpressionValidator
。
我知道这可以通过将values
数组移到ExpressionValidator
定义之外来解决,但我想尽可能将其保留在内部,以便它不会与全局中的任何内容冲突命名空间。如果没有其他方法可以做到这一点,这应该只是最后的手段。
答案 0 :(得分:1)
当编写没有任何函数范围的文字来设置值this
时,你必须将所有内容包装在IIFE中以获取值。
做你想做的更好的模式是
var ExpressionValidator = {};
ExpressionValidator.values = [
"value1",
"value2",
"value3"
];
ExpressionValidator.functionParamValues = {
Func1: ExpressionValidator.values,
Func2: ExpressionValidator.values
}
如果你有实际的功能,那将是另一回事
var ExpressionValidator = {
values: [
"value1",
"value2",
"value3"
],
Func1: function() {
console.log( this.values );
},
Func2: function() {
console.log( this.values );
}
}
答案 1 :(得分:1)
如果你不希望它在全局范围内,那么在闭包内定义数组。
var ExpressionValidator = (function() {
var values = [
'value1',
'value2',
'value3'
];
return {
values: values,
functionParamValues: {
Func1: values,
Func2: values
}
};
})();