Сбой инициализации объекта внутри другого объекта в IE8 - PullRequest
3 голосов
/ 15 февраля 2012

Я хочу реализовать своего рода одноэлементный объект (About в приведенном ниже примере), который сам по себе находится внутри другого объекта (Main).

Это мой код.Он работает во всех основных браузерах (Firefox, Chrome и даже IE9), но не в IE8.В IE8 вызов main.About.doSomething(); вызывает «Объект не поддерживает это свойство или метод».

Я также jsFiddled мой код здесь: http://jsfiddle.net/c3URh/12/

Что мне нужно для того, чтобызаставить его работать в IE8?

Примечание: Я могу позвонить main.About().doSomething(), и он будет работать в IE8, но не будет работать в других браузерах, и в любом случае это неверно из ООПперспектива.

Мой код ошибки:

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 ]

3 голосов
/ 15 февраля 2012

IE8 не поддерживает Object.defineProperty. Итак, код блока catch выполнен. В этом блоке вы не определили правильную замену для About геттера.

Это (внутри catch) функция:

    this.About = function() {
        if (about == undefined) {
            about = new About();
        }
        return about;
    };

Пока вы ожидаете, что это будет экземпляр About. IE8 не поддерживает геттеры, поэтому вы должны использовать другой метод. Ближайшее, что вы можете получить:

    this.About = about == undefined ? new About() : about;
1 голос
/ 15 февраля 2012

До 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 и ниже, но вы все равно использовали это неправильно

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

1 голос
/ 15 февраля 2012

Не потому ли, что defineProperty не работает и, следовательно, нет «О чем добавить»?IE8 имеет только частичную поддержку defineProperty, которую можно найти с помощью поиска в Google или SO: Работа с неработающей реализацией Object.defineProperty в IE8

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

...