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

Sea*_*son 2 javascript oop jquery 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;
    }
},
Run Code Online (Sandbox Code Playgroud)

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

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

(编辑:显然我可以在这里使用它而不是组件,所以'缺乏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 });
Run Code Online (Sandbox Code Playgroud)

请注意,我不需要说这个,我需要说组件,因为这是在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;
    }
},
Run Code Online (Sandbox Code Playgroud)

但是,上面的代码不起作用.当我说Components.SelectedID吸气警报没有发射时.

set*_*ler 5

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

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

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;
    }
},
Run Code Online (Sandbox Code Playgroud)

我不是在争论这是一个好主意,它只是你实现你想要做的事情的方式.