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 или более кросс-браузерной совместимости?
Заранее спасибо!
3 ответа
Если тебе надо Object.create
Есть хорошие шансы, что вам, возможно, придется полагаться и на другие функции es5. Поэтому в большинстве случаев подходящим решением будет использование es5-shim.
Однако если Object.create
это единственное, что вам нужно, и вы используете его только для простой настройки цепочки прототипов, вот легкая поли-заливка, которая не поддерживает null
в качестве первого аргумента и не поддерживает второй properties
аргумент.
Вот спецификация:
15.2.3.5 Object.create (O [, Properties])
Функция create создает новый объект с указанным прототипом. Когда вызывается функция create, предпринимаются следующие шаги:
Если Type(O) не является Object или Null, выдается исключение TypeError.
Пусть obj будет результатом создания нового объекта, как будто выражением new Object(), где Object является стандартным встроенным конструктором с таким именем
Установите для внутреннего свойства [[Prototype]] объекта obj значение O.
Если аргумент Properties присутствует и не является неопределенным, добавьте собственные свойства в obj, как будто вызывая стандартную встроенную функцию Object.defineProperties с аргументами obj и Properties.
Вернуть объект
Вот облегченная реализация:
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's 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's implementation of Object.create is a shim and doesn't support a second argument.");
function F() {}
F.prototype = o;
return new F();
};
}
Есть несколько прокладок, которые обеспечивают это, включая этот.
Обратите внимание, что Object.create
тем не менее, онне может быть полностью отброшен, потому что среди прочего он может создавать не перечисляемые свойства или свойства с помощью методов получения и установки, что невозможно сделать во всех браузерах до ES5. (Вы можете использовать методы получения и установки в некоторых браузерах до 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();
};
}
Это заставит Object.create() работать в IE 8.
Я попробовал Шим / Шам, но это не сработало для меня.
if (typeof Object.create !== 'function') {
Object.create = function(o, props) {
function F() {}
F.prototype = o;
if (typeof(props) === "object") {
for (prop in props) {
if (props.hasOwnProperty((prop))) {
F[prop] = props[prop];
}
}
}
return new F();
};
}