2013-04-07 14 views
8

データ型を作成してその動作を公開しているとします。Javascript:新しいデータ型を定義する方法のガイドラインは何ですか?

  • &新機能:

    // define new data type 
    var CustomDataType= function(){ 
             this.a='whatever'; 
             this.doX= function(){/*some code*/}; 
            } 
    
    // create a new instance of our custom data type 
    var obj= new customDataType(); 
    
  • オブジェクトリテラル& Object.create:

    // define new data type 
    var customDataType = { 
             a: 'whatever', 
             doX: function(){/*some code*/} 
            } 
    
    // create a new instance of our custom data type 
    var obj= Object.create(customDataType); 
    
  • あなたは、いくつかのあなたが使用する際の例を与えることができます

    あなたを構築する機能Rオブジェクト:

    function customDataTypeFactory(options){ 
        return { 
          a: 'whatever', 
          doX: function(){/*some code*/} 
         } 
    }; 
    
    // create a new instance of our custom data type 
    var obj= customDataTypeFactory(options); 
    

私は、これがために、重複を標識することができ感じる:Object.createnewが、私の主な関心が優れている1議論にではなく、どこ1がすべき具体的な使用例があるかどうかを知るために他のものより優先する。

私は、関連する質問やCrockfordの本:Javascript:The good partsに関する多くの記事を読んでいます。これまでのところ、私はそれが優先事項であると結論づけました。Crockfordのアドバイスは、私と一緒に私にたくさんの響きを与えます。「危険で不必要な機能を避けてみてください...」私はnewについて話しています。

+0

あなたの最初のバージョンと3番目のバージョンでは、新しいオブジェクトにプロパティを直接配置します。 2番目のバージョンでは、オブジェクトはプロパティを継承します。あなたの質問に具体的な答えがあるのか​​どうかわかりません。最初のものは 'new'を使って呼び出すとコンストラクタを使います。そして' instanceof'はそのオブジェクトを識別するために働きます。3つ目は 'new'の使用を必要としませんが、' instanceof'はそれほど有用ではありません。もう1つはプロパティを継承します。そのように複数のオブジェクトを作成すると、すべてのデータが共有され、すべてのオブジェクトは継承されたオブジェクトの更新を観察します。 –

+0

... Crockfordの危険警告にあまり気をつけないでください。彼は少し心配していると思う。私はそれをすべて取り込みますが、塩の穀物でそれを取ることを意味します。 –

+1

最後の2つのスニペットの 'this.doX ='は 'doX:'でなければなりません –

答えて

7

私は通常のクラスを定義する方法から始めましょう:F.prototype = { a : [1,2,3]; }に問題があるので、私は、コンストラクタ内の変数を割り当てる

function CustomDataType(a) 
{ 
    this.a = a; 
    this.b = 2; 
} 
CustomDataType.prototype = { 
    doX : function() {} 
}; 
var obj = new CustomDataType(1); 

プロパティは、コンストラクタに再初期化されない限り、配列は(インスタンス間で共有されますすべての非プリミティブ型に問題があります)。プロパティーが何らかの形でコンストラクターの引数に依存する場合にも必要です。プロトタイプのメソッドをすべてのインスタンス間で共有するように宣言します。継承を使用すると、スーパーコールを持つことができます。メソッドが1回だけ割り当てられるため、メモリ使用量が少なくなります(ただし、大きな問題です)。

私はObject.createを一度も使用していませんが、あなたが何か狂ったダイナミックなハッカーにならない限り、何の理由もありません。

オブジェクトの別のクラスを作成する必要がないときはいつでも(例えば呼び出し側が何かを明示的にインスタンス化する必要がないように)メソッドの引数である場合や、誰にでもアクセスできます。

あなたの工場は本質的にオブジェクトリテラルと同じです。私はそれがいくつかのjsonesque構造を作成し、いくつかのデフォルト値を設定する必要がある場合に役立つことができると思います。

私はなぜnewが危険であるか不必要であるとは思わないのですか。

しかし、私はそれが味わいになると思います。一貫性を保ち、事を複雑にしないでください。

+2

Crockfordさんの 'new'の問題は次のようなものです:"コンストラクタ関数を呼び出すときに 'new'接頭辞を付けるのを忘れた場合、' this'は悲しいことに、これはグローバルオブジェクトにバインドされるので、新しいオブジェクトを増やす代わりに、グローバル変数を壊すことになります。0122 " – DCoder

+1

ああ、私はおそらく彼から読んで覚えています。 '関数C(x){if(this == window)が新しいC(x)を返すようなことができます。 this.x = x; } ' 私はJSを書くときに大変混乱しますが、私は' new'を書くことを忘れていません... –

+0

@AdamBergmarkは、新しいを使用して強制する際にエラーを投げるのが良いのではないでしょうか? – Dreamwalker

関連する問題