3

当我发现这段代码时,我正在阅读John Resig关于 JavaScript Getters 和 Setters 的文章:

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 和 Setters,所以我认为这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 会检查语法错误,并在getandset行中错误地发现这些错误。

4

1 回答 1

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;
    }
};
于 2012-06-30T19:04:42.453 回答