¿Por qué crear una función Global-ish Object.create?

8

Soy un programador bastante experimentado en los dominios .NET y Java, y he comenzado a leer sobre JavaScript. Compré el libro "The Good Parts" de Douglas Crockford, y algunas cosas me desaniman de inmediato.

Uno está modificando los tipos fundamentales sin necesidad:

if (typeof Object.create !== 'function') {
    Object.create = function (o) { //Really... 'o'? For a parameter you're only using twice?
        function F() {}
        F.prototype = o;
        return new F();
    };
}
newObject = Object.create(oldObject);

Obviamente, crear una función con este propósito es útil y ahorra tiempo, pero ¿POR QUÉ EN LA TIERRA está recomendando crearla en Object? Hace tres respiraciones, propuso que los globals son malvados, y luego procedió a mono parchear Objeto. Incluso prueba si ya existe, y simplemente asume que si alguna otra biblioteca lo hizo por él, la implementación es la misma.

¿Hay alguna razón para no crear esto en el equivalente JS de un espacio de nombres? es decir

MY_UNIQUE_UTIL_LIBRARY.create = function(obj){...}; //The name would be shorter in reality.

No me malinterpreten, creo que el parche de mono es útil, pero es algo que haces cuando hay un beneficio inherente. ¿No veo uno aquí? ¿Hay uno?

Casey
fuente
44
+1 por cuestionar a Crockford, quien hace demasiados argumentos religiosos fuertemente discutidos (muchos de los cuales también son malas ideas en mi humilde opinión).
user949300
77
Es un polyfill. Lo llena en navegadores antiguos (ES3).
Benjamin Gruenbaum

Respuestas:

8

Object.createse define en las versiones más recientes de los navegadores (no puedo decir exactamente desde cuándo). Puede ver su descripción en la red de desarrolladores de Mozilla .

Esto es solo un polyfill (bastante similar al de esa página, con algunas comprobaciones menos) para poder usar la misma función en navegadores antiguos. En el navegador más nuevo, ya está definido como una función y, por lo tanto, usará la versión optimizada del navegador, mientras que en los navegadores más antiguos no está definido de manera predeterminada y usará esta versión.

usuario2313067
fuente
1
no pregunta dónde está definido, sino por qué.
Jwenting
1
Crockford es Object.createanterior a ES5, por lo que esta respuesta es cronológicamente incorrecta.
Zirak
1
@Zirak antes de eso fue llamado begety lo definió en cualquier ámbito en el que se encontraba y no en él Object, por lo que esta respuesta no es cronológicamente incorrecta.
Benjamin Gruenbaum
1
@BenjaminGruenbaum javascript.crockford.com/prototypal.html ver al final - 2008 fue antes de ES5
Zirak