10

this questionと似ていますが、異なるです。以下のコードはJavaScript: The Definitive Guideです。彼は基本的に継承メソッドを定義しています。存在する場合はObject.createを継承します。そうでない場合は、コンストラクタを使用してプロトタイプを交換してプレーンな古いJavascript継承を行います。Object.createを使用する利点

私の質問は、Object.createが に存在しないので、多くの一般的なブラウザ IEには、それを使用しようとしても何のポイントがありますか?それは確かにコードを騒がしくし、前の質問のコメント作成者の一人は、Object.create isn't too fastに言及しました。

これを行う「古い」方法よりも遅いかもしれないし、そうでないかもしれないこの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. 
} 

答えて

9

(私はたくさん呼んでない何百、何千もの)性質上、おそらくあまりにも多くのオブジェクトを作成することはありませんので、速度差は、非常に顕著ではなく、あなたがいるとスピードがある場合あなたがおそらくJSでコーディングしないという重大な問題であり、上記の両方が真実でない場合、すべての普及したJSエンジンのいくつかのリリースの中で、その差はごくわずかです(これはすでに一部)。あなたの質問への答えで

、理由はスピードに関係ありませんが、Object.createデザインパターンは(そのおよび他の回答で概説さの理由のために)古い方法に好まれているため。 ES5プロパティの属性(適切なスケーラビリティを持つオブジェクト、つまりスケーラブルなアプリケーションを作成するため)を適切に活用することができ、継承階層を支援することができます。

フォワードエンジニアリングです。 「どこにでも実装されていないので、足を濡らさないように」という行を取った場合、物事は非常にゆっくりと動きます。逆に、早期かつ野心的な採用は、業界の発展を促進し、ビジネス意思決定者が新しいテクノロジをサポートし、開発者が新しいアイデアやサポートフレームワークを改善し、完成させるのに役立ちます。私は技術をサポートするのに十分な人が待っていると、あまりにも長く待たされるという経験があることから、早期(予防的かつ予防的でありながら後方互換性があります)採用を主張しています。 5月IE6は、そうでないと思う人に教訓になるかもしれません。

+0

これは本当に役立つ答えです。作成したオブジェクトのプロパティを多くのコントロールを提供するので、なぜcreateが望ましいのか分かります。なぜあなたが 'var bob = Object.create(userB、{" id ":{value:12、enumerable:false'などと言っても、IE9以下ではこのコードが激しくクラッシュしないと言うことができますあなたのユーザーが使用しているブラウザを制御できる(素晴らしい)状況に限定されているようなコードではないでしょうか? –

+0

つまり、IE8では古いJSを使って新しい継承メソッドを取得する必要があるだけでなくプロトタイプを交換する方法もありますが、渡されたオブジェクトをuserBを継承する "子"オブジェクトとして変更する必要もあります。{{"id":{value:12、enumerable:false 012 "私は" {"id":12、 "name": "bob"}など何も必要ないでしょうか? –

+0

@AdamRackis、それは正しいですが、そのままのコードは後方互換性はありませんが、これらのことを試して合理化するプロジェクト。もしそうでなければ、良い考えです。それらの変更を自動化するのは難しくありません。 – davin

関連する問題