Ответ 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();
};
}