找到以下代码后,我正在阅读有关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 value
和set 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将检查语法错误,并在
get
和set
行中错误地找到这些错误。 最佳答案
您可以定义属性,而无需在 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;
}
};