当我找到这段代码时,我正在阅读有关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 value
和set 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会检查语法错误,并错误地在get
和set
行中发现这些错误。
答案 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;
}
};