使用javascript getters& IE中的二传手

时间:2012-06-30 18:51:49

标签: javascript oop internet-explorer getter-setter

当我找到这段代码时,我正在阅读有关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 Getters和Setter,所以我认为get valueset value是语法错误。

有没有办法让这个代码跨浏览器?

提前致谢

修改

我还尝试检查浏览器是否支持getter& 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行中发现这些错误。

1 个答案:

答案 0 :(得分:6)

您可以在不使用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;
    }
};