在IE8中初始化另一个对象内的对象失败

时间:2012-02-15 17:42:18

标签: javascript oop internet-explorer-8 properties singleton

我想在下面的例子中实现一种单例对象(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();
}
​

3 个答案:

答案 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

http://blogs.msdn.com/b/ie/archive/2010/09/07/transitioning-existing-code-to-the-es5-getter-setter-apis.aspx

答案 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的问题,但是你无论如何都以糟糕的方式使用它

http://jsfiddle.net/mendesjuan/zPq4v/