找到以下代码后,我正在阅读有关JavaScript Getters和Setters的John Resig's article:

function Field(val){
    this._value = val;
}
Field.prototype = {
    get value(){
        return this._value;
    },
    set value(val){
        this._value = val;
    }
};

我已经测试过了,它与所有主流浏览器完美配合,但该死的IE除外,这给了我SCRIPT1003: ':' expected错误。在想了一会儿之后,我意识到发生此错误是因为IE无法识别JavaScript Getter和Setter,因此我认为get valueset value是语法错误。

有什么办法可以使此代码跨浏览器?

提前致谢

编辑:

我还尝试检查浏览器是否支持getters&setters:
if(window.__lookupSetter){
    Field.prototype = {
        get value(){
            return this._value;
        },
        set value(val){
            this._value = val;
        }
    };
}else{
    Field.prototype = {
        value: function(val){
            if(val)
                return this._value = val;
            return this._value;
        }
    };
}

但是在执行代码之前,IE将检查语法错误,并在getset行中错误地找到这些错误。

最佳答案

您可以定义属性,而无需在 Object.defineProperty 中使用新语法:

function Field(val){
    this.value = val;
}
Object.defineProperty(Field.prototype, 'value', {
    get: function(){
        return this._value;
    },
    set: function(val){
        this._value = val;
    }
});

这样,代码在较旧的浏览器中不会出现语法错误。

WRT进行修改,后备代码:
Field.prototype = {
    value: this._value
};

不管用。 this将指向全局对象window

跨浏览器真正使用getter和setter的唯一方法是根本不使用它们:
Field.prototype = {
    getValue: function() {
        return this._value;
    },
    setValue: function(val) {
        this._value = val;
    }
};

10-04 17:51