使用Javascript singleton中的数组成员初始化对象成员的属性

时间:2014-04-05 19:27:53

标签: javascript arrays object singleton

我在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定义之外来解决,但我想尽可能将其保留在内部,以便它不会与全局中的任何内容冲突命名空间。如果没有其他方法可以做到这一点,这应该只是最后的手段。

2 个答案:

答案 0 :(得分:1)

当编写没有任何函数范围的文字来设置值this时,你必须将所有内容包装在IIFE中以获取值。
做你想做的更好的模式是

var ExpressionValidator = {};

ExpressionValidator.values = [
    "value1",
    "value2",
    "value3"
];

ExpressionValidator.functionParamValues = {
    Func1: ExpressionValidator.values,
    Func2: ExpressionValidator.values
}

FIDDLE

如果你有实际的功能,那将是另一回事

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
        }
    };
})();