2013-08-02 2 views
21

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

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

Вот код:

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

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

Заранее благодарен!

+0

Не трудно найти подкладку, если вы смотрите. –

+0

Это первый вопрос, который возникает в Google при поиске 'Object.create IE8'. +1 – cheeesus

ответ

37

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

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

Вот спецификации:

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

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

Если тип (O) не является объектным или нулевым, выбрасывает исключение TypeError.

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

Установите [[Prototype]] внутреннее свойство из OBJ к О.

Если свойства аргумента присутствуют и не определены, добавлять собственные свойства OBJ как при вызове встроенной в функции стандартного Object.defineProperties с аргументами 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'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(); 
    }; 
} 
+2

Второй параметр - шутка, интересно, действительно ли кто-то использует этот смехотворный подробный синтаксис для создания объектов в реальном коде. – Esailija

+0

@plalx: MDN - совместная редакция. Нет «официального». Я видел некоторый * серьезно * ошибочный код на MDN. (Проверьте первый пример совместимости на странице ['Array # forEach'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach), для экземпляр. Полностью и совершенно неправильно.) См. реализацию в [es5-shim] (https://github.com/kriskowal/es5-shim/) для чего-то, что, по крайней мере, приложит максимум усилий, где это возможно. –

+0

@Esailija: этот смехотворный подробный синтаксис в настоящее время является единственным синтаксисом, доступным для определения дескрипторов свойств. –

19

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

Обратите внимание, что Object.createне могут быть совершенно подкладок, хотя, потому что, среди прочего, он может создать несчетное свойство или свойство с добытчиками и сеттерами, которые вы не можете сделать на все браузеры до 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(); 
    }; 
} 
+0

+1 для пояснения;) – plalx

+0

Отличное объяснение, спасибо. –

+1

Этот полис гораздо легче читать, чем тот, который предложен plalx в другом ответе, хотя оба делают трюк. –

Смежные вопросы