寻找javascript getter / setter equiv。这不会产生警告

时间:2012-01-25 18:58:20

标签: javascript jquery oop get set

目前有这个代码为对象的selectedID属性定义getter / setter。该对象称为组件。

_selectedID: null,

get SelectedID() {
    return this._selectedID;
},
set SelectedID(val) {
    if (!isNaN(val) && val != this._selectedID) {
        this._notifyChanged(val);
        this._selectedID = val;
    }
},

虽然这在浏览器知道如何处理生成的javascript的意义上有效,但Visual Studio声明存在语法警告。

这是说同样的事情的另一种方式,但缺乏前一个的OOP:

(编辑:显然我可以在这里使用它而不是组件,因此'缺乏OOPness'并不是一个问题,但如果更好的话仍然很好奇。)

function GetSelectedID() {
    //return Components._selectedID;
    return this._selectedID;
}

function SetSelectedID(val) {
    //if (!isNaN(val) && val != Components._selectedID) {
        //Components._notifyChanged(val);
        //Components._selectedID = val;
    //}

    if (!isNaN(val) && val != this._selectedID) {
        this._notifyChanged(val);
        this._selectedID = val;
    }
}

Object.defineProperty(Components, 'SelectedID', { get: GetSelectedID
                                       , set: SetSelectedID
                                       , configurable: true
                                       , enumerable:   true });

请注意,我不需要这样说,我需要说组件,因为这是在Component的对象构造函数之外设置的。如果我尝试将函数移动到构造函数中,则会出现语法错误。

有谁知道是否有可能同时实现这两项目标?类似的东西:

SelectedID: function () {
    alert("Getter");
    return this._selectedID;
},

SelectedID: function (val) {
    alert("setter");
    if (!isNaN(val) && val != this._selectedID) {
        this._notifyChanged(val);
        this._selectedID = val;
    }
},

但上述代码不起作用。当我说Components.SelectedID时,吸气警报不会触发。

2 个答案:

答案 0 :(得分:5)

Javascript中没有方法重载,因此您只需使用setter重新定义SelectedID

如果你想为两者提供一种方法,请尝试以下方法:

SelectedID: function() {
    if (arguments.length === 1) {
        var val = arguments[0];
        if (!isNaN(val) && val != this._selectedID) {
            this._notifyChanged(val);
            this._selectedID = val;
        }
    } else {
        return this._selectedID;
    }
},

我并不认为这是一个好主意,它只是你想要实现的目标。

答案 1 :(得分:0)

尝试这样的事情:

SelectedID: function (val) {
    if (val === undefined) {
        alert("Getter");
        return this._selectedID;
    } else {
        alert("setter");
        if (!isNaN(val) && val != this._selectedID) {
            this._notifyChanged(val);
            this._selectedID = val;
        }
    }
}