Подтвердить что ты не робот

Поддержка JavaScript getter в IE8

Проверьте этот код. Это очень простой объект JavaScript, который реализуется с помощью Module Pattern (и вы можете увидеть живой пример в этот адрес скрипта)

var human = function() {
    var _firstName = '';
    var _lastName = ''
    return {
        get firstName() {
            return _firstName;
        }, get lastName() {
            return _lastName;
        }, set firstName(name) {
            _firstName = name;
        }, set lastName(name) {
            _lastName = name;
        }, get fullName() {
            return _firstName + ' ' + _lastName;
        }
    }
}();
human.firstName = 'Saeed';
human.lastName = 'Neamati';
alert(human.fullName);

Однако IE8 не поддерживает ключевые слова JavaScript get и set. Вы можете проверить и посмотреть MDN.

Что мне делать, чтобы сделать этот script совместимым с IE8?

4b9b3361

Ответ 1

Что мне делать, чтобы сделать этот script совместимым с IE8?

Измените его полностью. Например, вместо использования свойств доступа используйте комбинацию нормальных свойств и функций:

human.firstName = 'Saeed';
human.lastName  = 'Neamati';
alert(human.getFullName());

Кто-то еще предложил использовать объект DOM в IE и добавить свойства с помощью Object.defineProperty(). Хотя это может сработать, я бы настоятельно рекомендовал против этого подхода по нескольким причинам, примером чего является то, что код, который вы пишете, может быть несовместим во всех браузерах:

var human = document.createElement('div');
Object.defineProperty(human, 'firstName', { ... });
Object.defineProperty(human, 'lastName',  { ... });
Object.defineProperty(human, 'children',  { value: 2 });

alert(human.children);
//-> "[object HTMLCollection]", not 2

Это относится как минимум к Chrome. В любом случае это безопаснее и проще писать код, который работает во всех браузерах, которые вы хотите поддерживать. Любое удобство, которое вы получаете от возможности писать код, чтобы использовать преимущества getters и seters, было потеряно в дополнительном коде, который вы написали специально для Internet Explorer 8.

Это, конечно, в дополнение к снижению производительности, тот факт, что вы не сможете использовать цикл for...in для объекта и потенциальную путаницу, возникающую при использовании свойства, которое, по вашему мнению, вы определили, но ранее существовала на объекте DOM.

Ответ 2

Вы не можете (как ответил Энди)

Ближайшей альтернативой будет

var human = function() {
    var _firstName = '';
    var _lastName = '';

    return {
        firstName: function() {
            if (arguments.length === 1) {
                _firstName = arguments[0];
            }
            else {
                return _firstName;
            }
        },
        lastName: function() {
            if (arguments.length === 1) {
                _lastName = arguments[0];
            }
            else {
                return _lastName;
            }
        },
        fullName: function() {
            return _firstName + ' ' + _lastName;
        }
    };
}();

human.firstName('Saeed');
human.lastName('Neamati');

alert(human.fullName());

Демо на http://jsfiddle.net/gaby/WYjqB/2/

Ответ 3

IE8 поддерживает геттеры и сеттеры на узлах DOM, поэтому, если вы действительно хотите иметь геттеры и сеттеры, вы можете сделать это:

var objectForIe8 = $("<div></div>")[0];    
Object.defineProperty(objectForIe8, "querySelector", {
    get: function() {
        return this.name;
    },
    set: function(val) {
        this.name = val+", buddy";  
    }
});
// notice you can overwrite dom properties when you want to use that property name
objectForIe8.querySelector = "I'm not your guy"; 

alert(objectForIe8.querySelector);

Обратите внимание, что это дает вам несколько значительную производительность, поэтому я не буду использовать эту технику, если вам нужно создать тысячи таких объектов. Но если вы не беспокоитесь о производительности этого конкретного объекта, он вас собьет. И если вам не все равно, о производительности, и просто хочу, чтобы она работала, используйте эту технику только для ie8, и вы золотой:)

Ответ 4

Проверьте это на http://robertnyman.com/2009/05/28/getters-and-setters-with-javascript-code-samples-and-demos/

Будущее, и стандартизованный способ ECMAScript, расширения объектов в всевозможные способы - через Object.defineProperty. Вот как Internet Explorer решил внедрить геттеры и сеттеры, но это к сожалению, пока доступно только в Internet Explorer 8, а не в любой другой веб-браузер. Кроме того, IE 8 поддерживает его только на узлах DOM, но будущие версии планируется поддерживать на объектах JavaScript как хорошо.

Вы можете найти тестовые примеры на том же сайте http://robertnyman.com/javascript/javascript-getters-setters.html#object-defineproperty

Object.defineProperty(document.body, "description", {
    get : function () {
        return this.desc;
    },
    set : function (val) {
        this.desc = val;
    }
});
document.body.description = "Content container";

Результат:

document.body.description = "Content container"