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

Object.create не поддерживается в ie8

Я столкнулся с проблемой с плагином, который использует object.create в jquery для создания раскрывающегося списка. Я только заметил в IE 8, что он выдает ошибку:

SCRIPT438: Object doesn't support property or method 'create'

Вот код:

var dropdateobj = Object.create(dropdatefuncs);
dropdateobj.create(options, this);
$.data(this, 'dropdate', dropdateobj);

Что такое хорошая работа для браузера IE8 или более кросс-браузера?

Спасибо заранее!

4b9b3361

Ответ 1

Если вам нужно Object.create, есть хорошие шансы, что вам, возможно, придется полагаться и на другие функции es5. Поэтому в большинстве случаев подходящим решением было бы использовать es5-shim.

Однако, если Object.create - единственное, что вам нужно, и вы используете его только для настройки прототипной цепочки, здесь имеется легкая поли-заливка, которая не поддерживает null в качестве первого аргумента и не поддерживает второй аргумент properties.

Здесь spec:

15.2.3.5 Object.create(O [, Свойства])

Функция create создает новый объект с указанным прототипом. Когда вызывается функция create, выполняются следующие шаги:

Если Type (O) не является Object или Null, генерирует исключение TypeError.

Пусть obj является результатом создания нового объекта, как если бы выражение new Object(), где Object является стандартным встроенным конструктором с это имя

Задайте внутреннее свойство [[Prototype]] объекта obj в O.

Если аргумент Properties присутствует, а не undefined, добавьте собственный свойства obj, как если бы он вызывал стандартную встроенную функцию Object.defineProperties с аргументами obj и свойствами.

Возврат obj.

Здесь легкая реализация:

if (!Object.create) {
    Object.create = function(o, properties) {
        if (typeof o !== 'object' && typeof o !== 'function') throw new TypeError('Object prototype may only be an Object: ' + o);
        else if (o === null) throw new Error("This browser implementation of Object.create is a shim and doesn't support 'null' as the first argument.");

        if (typeof properties != 'undefined') throw new Error("This browser implementation of Object.create is a shim and doesn't support a second argument.");

        function F() {}

        F.prototype = o;

        return new F();
    };
}

Ответ 2

Есть несколько прокладок, которые предоставляют это, включая этот.

Обратите внимание, что Object.create не может быть полностью подвешенным, тем не менее, потому что, среди прочего, он может создавать неперечислимые свойства или свойства с геттерами и сеттерами, которые вы не можете сделать во всех браузерах pre-ES5. (Вы можете делать геттеры и сеттеры в некоторых браузерах pre-ES5 с использованием проприетарного синтаксиса, но не на IE8, я не верю.) Это может быть только псевдо-подгонка.

Но псевдо-прокладка сделает для используемого вами случая.

Просто для полноты, здесь простая версия части, которую можно подкрепить:

if (!Object.create) {
    Object.create = function(proto, props) {
        if (typeof props !== "undefined") {
            throw "The multiple-argument version of Object.create is not provided by this browser and cannot be shimmed.";
        }
        function ctor() { }
        ctor.prototype = proto;
        return new ctor();
    };
}