なぜグローバルっぽいObject.create関数を作成するのですか?


8

私は.NETとJavaの分野でかなり経験豊富なプログラマーであり、JavaScriptについて読み始めました。Douglas Crockfordの "The Good Parts"の本を購入しましたが、すぐにいくつかのことが気になりませんでした。

1つは、必要のない基本的な型を変更することです。

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

明らかにこの目的で関数を作成すると便利で時間を節約できますが、なぜ地球上でオブジェクト上に作成することを勧めているのですか?3呼吸前に彼はグローバルが悪であることを支持し、それから彼はモンキーパッチオブジェクトに進みました。彼はそれがすでに存在するかどうかさえテストし、他のライブラリが彼のためにそれを行った場合の実装は同じであると仮定します。

名前空間に相当するJSでこれを作成しない理由はありますか?すなわち

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

誤解しないでください。モンキーパッチは便利だと思いますが、固有の利点がある場合に行うパッチです。ここに表示されませんか?ありますか?


4
+1は、あまりにも多くの強く主張された宗教的議論をしているクロックフォードに質問するためのものです(それらの多くは悪い考えですIMHO)。
user949300

7
それはポリフィルです。古い(ES3)ブラウザーで埋められます。
Benjamin Gruenbaum

回答:


8

Object.create新しいバージョンのブラウザーで定義されています(いつからかは正確には言えません)。その説明はMozilla開発者ネットワークで見ることができます

これは、古いブラウザーで同じ機能を使用できるようにするための単なるポリフィル(そのページのチェックとかなり似ていますが、チェックが少し少なくなっています)です。新しいブラウザではすでに関数として定義されているため、ブラウザに最適化されたバージョンを使用しますが、古いブラウザではデフォルトで未定義であり、このバージョンを使用します。


1
彼はそれがどこに定義されているのか尋ねませんが、その理由は。
2015年

1
Crockford Object.createはES5よりも古いものなので、この答えは時系列で間違っています。
Zirak

1
@Zirakはそれが呼び出される前にbeget、彼は自分が属していていない範囲でそれを定義していましObjectた。そのため、この答えは年代順に間違っていません。
Benjamin Gruenbaum

1
@BenjaminGruenbaum javascript.crockford.com/prototypal.html終わりを見てください-2008年はES5より前
Zirak
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.