Por que criar uma função Global-ish Object.create?

8

Sou um programador bastante experiente nos domínios .NET e Java e comecei a ler sobre JavaScript. Comprei o livro "The Good Parts", de Douglas Crockford, e sou imediatamente incomodado por algumas coisas.

Um é modificar os tipos fundamentais sem necessidade:

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, criar uma função com esse objetivo é útil e economiza tempo, mas POR QUE NA TERRA ele recomenda a criação no Object? Três respirações atrás, ele defendeu que os globais são maus e, em seguida, passou a consertar Object. Ele até testa se ele já existe e apenas assume que, se alguma outra biblioteca fez isso por ele, a implementação é a mesma.

Existe algum motivo para não criar isso no equivalente JS de um espaço para nome? ie

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

Não me interpretem mal, acho que a aplicação de patches de macaco é útil, mas é algo que você faz quando há um benefício inerente. Eu não vejo um aqui? Existe um?

Casey
fonte
4
+1 por questionar Crockford, que apresenta muitos argumentos religiosos fortemente argumentados (muitos dos quais também são más idéias IMHO).
User949300 #
7
É um polyfill. Ele o preenche em navegadores antigos (ES3).
Benjamin Gruenbaum

Respostas:

8

Object.createé definido nas versões mais recentes dos navegadores (não é possível dizer exatamente desde quando). Você pode ver sua descrição na rede de desenvolvedores Mozilla .

Este é apenas um polyfill (bastante semelhante ao da página, com poucas verificações) para poder usar a mesma função em navegadores mais antigos. No navegador mais recente, ele já está definido como uma função e, portanto, usará a versão otimizada do navegador, enquanto nos navegadores mais antigos, por padrão, é indefinido e usará esta versão.

user2313067
fonte
1
ele não pergunta onde está definido, mas por quê.
Jwenting
1
Crockford é Object.createanterior ao ES5, então esta resposta é cronologicamente errada.
Zirak
1
O @ Zirak antes disso foi chamado begete ele o definiu em qualquer escopo em que estivesse ou não Object- então essa resposta não é realmente cronologicamente errada.
Benjamin Gruenbaum
1
@BenjaminGruenbaum javascript.crockford.com/prototypal.html ver à direita no final - 2008 era antes ES5
Zirak