Warum eine Global-ish Object.create-Funktion erstellen?

8

Ich bin ein ziemlich erfahrener Programmierer in den Bereichen .NET und Java und habe angefangen, mich mit JavaScript zu beschäftigen. Ich habe Douglas Crockfords "The Good Parts" -Buch gekauft und bin sofort von ein paar Dingen abgeschreckt.

Eine besteht darin, die grundlegenden Typen ohne Notwendigkeit zu modifizieren:

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);

Natürlich ist das Erstellen einer Funktion mit diesem Zweck nützlich und spart Zeit, aber WARUM AUF ERDE empfiehlt er, sie auf Objekt zu erstellen? Vor drei Atemzügen trat er dafür ein, dass Globale böse sind, und ging dann zum Affen-Patch-Objekt über. Er testet sogar, ob es bereits existiert, und geht nur davon aus, dass die Implementierung dieselbe ist, wenn eine andere Bibliothek dies für ihn getan hat.

Gibt es einen Grund, dies nicht im JS-Äquivalent eines Namespace zu erstellen? dh

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

Versteh mich nicht falsch, ich denke, das Patchen von Affen ist nützlich, aber es ist etwas, was du tust, wenn es einen inhärenten Vorteil gibt. Ich sehe hier keinen? Ist dort eines?

Casey
quelle
4
+1 für die Befragung von Crockford, der viel zu viele stark argumentierte religiöse Argumente vorbringt (von denen viele meiner Meinung nach auch schlechte Ideen sind).
user949300
7
Es ist eine Polyfüllung. Es füllt es in alten (ES3) Browsern.
Benjamin Gruenbaum

Antworten:

8

Object.createwird in neueren Versionen von Browsern definiert (kann nicht genau sagen, wann). Sie können die Beschreibung im Mozilla-Entwicklernetzwerk sehen .

Dies ist nur eine Polyfüllung (ähnlich der auf dieser Seite, mit ein paar weniger Überprüfungen), um dieselbe Funktion in älteren Browsern verwenden zu können. In neueren Browsern ist es bereits als Funktion definiert und verwendet daher die browseroptimierte Version, während es in älteren Browsern standardmäßig undefiniert ist und diese Version verwendet.

user2313067
quelle
1
er fragt nicht, wo es definiert ist, sondern warum.
Jwenting
1
Crockfords ist Object.createälter als ES5, daher ist diese Antwort chronologisch falsch.
Zirak
1
@Zirak davor wurde es aufgerufen begetund er definierte es in welchem ​​Umfang auch immer er sich befand und nicht Object- also ist diese Antwort nicht wirklich chronologisch falsch.
Benjamin Gruenbaum
1
@BenjaminGruenbaum javascript.crockford.com/prototypal.html siehe rechts am Ende - 2008 war vor ES5
Zirak