Hay varias cosas que no se puede emular desde la Object.create
método de ECMAScript 5 en un entorno ECMAScript 3.
Como viste, el argumento de las propiedades te dará problemas ya que en las implementaciones basadas en E3 hay de ninguna manera para cambiar los atributos de la propiedad.
Los Object.defineProperty
método como @Raynos mencionados, funciona en IE8, pero parcialmente, que se puede utilizar solamente en elementos DOM.
también propiedades de descriptor de acceso le dará problemas, que podría ser imitado con métodos no estándar ampliamente compatibles, como __defineGetter__
/__defineSetter__
, pero de nuevo, no puede cambiar los atributos de la propiedad.
Otro problema aparte de los descriptores de propiedad, es que el método Object.create
puede aceptar null
como argumento, para crear un objeto que no hereda de nada.
Esto no puede ser emulada con la Crockford's Object.create
shim, porque cuando el operador new
se utiliza con una función constructora que tiene una propiedad que contiene prototype
null
-o cualquier otro de valor no-objeto, el objeto recién creado heredará del Object.prototype
de todos modos por defecto.
En algunas implementaciones -v8, Mono Araña, Rhino, etc ...- tienen un setteable __proto__
propiedad que podría ser utilizado para fijar un null
[[Prototype]], pero de nuevo, eso es no estándar, y de seguro nunca funcionará en IE.
Recomendaría, si desea orientar los navegadores antiguos para que no utilicen esas características, ya que no hay forma de que funcionen correctamente en esos entornos.
Si aún desea utilizar Object.create
, sin necesidad de utilizar las propiedades argumento, se puede, sin embargo, recomendaría usted para detectar las cosas que no pueden ser emuladas.
La siguiente sería una versión más segura del Crockford's Object.create
shim:
if (typeof Object.create != 'function') {
(function() {
var F = function() {};
Object.create = function (o) {
if (arguments.length > 1) { throw Error('Second argument not supported');}
if (o === null) { throw Error('Cannot set a null [[Prototype]]');}
if (typeof o != 'object') { throw TypeError('Argument must be an object');}
F.prototype = o;
return new F;
};
})();
}
De todos modos, utilizar con cuidado.
¡Siempre hay un marco de Chrome! – kzh