10

この質問と似ていますが、異なります。以下のコードはJavaScriptからのものです:決定的なガイド。彼は基本的に、Object.createが存在する場合はそれを延期する継承メソッドを定義しています。それ以外の場合は、コンストラクターを使用してプロトタイプを交換し、単純な古いJavascript継承を実行します。

私の質問は、Object.createは多くの一般的なブラウザIEには存在しないので、それを使おうとすることの意味は何ですか?それは確かにコードを乱雑にし、前の質問のコメント投稿者の1人は、Object.createはそれほど速くないと述べました。

では、このECMA 5関数をときどき利用するためにコードを追加しようとすることの利点は何でしょうか。これは、これを行う「古い」方法よりも遅い場合とそうでない場合があります。

function inherit(p) {
   if (Object.create) // If Object.create() is defined...
      return Object.create(p); // then just use it.

   function f() {}; // Define a dummy constructor function.
   f.prototype = p; // Set its prototype property to p.
   return new f(); // Use f() to create an "heir" of p.
}
4

1 に答える 1

9

速度の違いはあまり目立ちません。なぜなら、本質的にあまり多くのオブジェクトを作成することはないでしょう(数百、数千でさえ私がよく呼ぶものではありません)。 JSでコーディングしている場合、上記の両方が当てはまらない場合は、すべての一般的なJSエンジンのいくつかのリリース内で、違いは無視できると確信しています(これはすでに一部の場合に当てはまります)。

あなたの質問への回答では、理由は速度に関係していませんが、のデザインパターンObject.create古い方法に好まれているためです(その理由と他の回答で概説されている理由のため)。これらは、ES5プロパティ属性の適切な利用を可能にし(よりスケーラブルなオブジェクト、したがってよりスケーラブルなアプリを作成します)、継承階層を支援することができます。

それはフォワードエンジニアリングです。「どこにでも実装されていないので、足を濡らさないように」という言葉を使うと、物事は非常にゆっくりと動きます。それどころか、早期の野心的な採用は、業界の前進を助け、ビジネスの意思決定者が新しいテクノロジーをサポートし、開発者が新しいアイデアとサポートフレームワークを改善して完成させるのに役立ちます。私は早期の(しかし予防的であり、下位互換性のある)採用を支持しています。なぜなら、経験によれば、テクノロジーをサポートするのに十分な人を待つと、あまりにも長く待たされる可能性があるからです。IE6が他のことを考える人たちへの教訓になりますように。

于 2011-09-21T21:50:22.240 に答える