我想在下面的例子中实现一种单例对象(About
),它本身位于另一个对象(Main
)内。
这是我的代码。它适用于所有主流浏览器(Firefox,Chrome甚至IE9),但不适用于IE8。在IE8中,对main.About.doSomething();
的调用抛出'对象不支持此属性或方法'。
我也在这里jsFiddled我的代码:http://jsfiddle.net/c3URh/12/
为了让它在IE8中运行,我需要什么?
注意:我可以拨打main.About().doSomething()
,它可以在IE8中运行,但在其他浏览器中无法工作,无论如何,从OOP的角度看它是不正确的。
我的错误代码:
function About(){
this.doSomething = function(){
alert('a');
};
}
function Main(){
var about;
try {
Object.defineProperty(this, 'About', {
get: function () {
if (about == undefined) {
about = new About();
}
return about;
}
});
}
catch (e) {
// this code does not work in ie8. Throwing 'Object doesn't support this property or method'
this.About = function() {
if (about == undefined) {
about = new About();
}
return about;
};
}
}
function clickMe()
{
var main = new Main();
main.About.doSomething();
}
答案 0 :(得分:3)
IE8不支持Object.defineProperty
。因此,执行catch
块的代码。在该块中,您没有为About
getter定义正确的替换。
这(内部catch
)是一个函数:
this.About = function() {
if (about == undefined) {
about = new About();
}
return about;
};
虽然您将其视为About
的实例。 IE8不支持getter,因此您必须使用其他方法。你能得到的最接近的是:
this.About = about == undefined ? new About() : about;
答案 1 :(得分:1)
这不是因为defineProperty失败,因此没有关于要添加吗? IE8只对partialProperty有部分支持,你可以通过google或SO搜索找到它:Working around IE8's broken Object.defineProperty implementation
答案 2 :(得分:1)
在IE9之前没有吸气剂,这段代码看起来很滑稽。使用getter实例化一个私有变量,并添加一个检查,以便它只在第一次执行?这就是构造函数的用途。
function About(){
this.doSomething = function(){
alert('a');
};
}
function Main(){
this.About = new About();
}
var main = new Main();
main.About.doSomething(); // alerts 'a'
这并没有解决你如何在IE8及以下版本中实现getter的问题,但是你无论如何都以糟糕的方式使用它