2011-07-07 23 views
7

JavaScriptではこれまでにnewというキーワードを使っています。私はObject.createについて読んでいて、代わりにそれを使うべきかどうか疑問に思います。私が得意でないのは、しばしばコンストラクションコードを実行する必要があるということなので、実行する関数を起動させないので、Object.createがどのように動作するのか分かりません。JavaScriptでObject.create()またはnewを使用する理由はありますか?

誰に教えてもらえますか?newの代わりにObject.createを使用する必要がありますか?

var obj = {}; 

またはObjectコンストラクタ:あなたがオブジェクトを作成する場合は

+0

はこの質問への回答を参照してください。http://stackoverflow.com/questions/4166616/understanding-the-difference-between-オブジェクト作成と新規のsomefunction-in-ja –

+0

これをすべての新しい回答とともに参照してください。http://stackoverflow.com/questions/387707/whats-the-best-way-to-define-a-class -in-javascript –

答えて

11

はこれまでのところ、あなただけのリテラルを使用することができます。

var obj = Object(); 

しかし、これらの方法はいずれも、作成したオブジェクトのプロトタイプを指定できます。

Object.createでこれを行うことができます。新しいオブジェクトを作成し、最初の引数を新しいオブジェクトのプロトタイプとして設定します。さらに、第2引数として提供される新しいオブジェクトのプロパティを設定することができます。それは、(第二引数なし)は、このような何かをやってに似て

:だから

function create(proto) { 
    var Constr = function(){}; 
    Constr.prototype = proto; 
    return new Constr(); 
} 

あなたはこれに似た構文を使用している場合、あなたはObject.createを使用していたこの。

newの代わりではありません。別のオブジェクトから簡単に継承する単一のオブジェクトを作成するための追加機能です。

例:

私はオブジェクトa持っている:

var a = { 
    someFunction: function() {} 
}; 

を、私はbは、このオブジェクトを拡張したいです。そして、あなたはObject.createを使用することができます。

b = Object.create(a); 
b.someOtherFunction = function(){}; 

あなたはコンストラクタ関数を持っていますが、あなただけそれからオブジェクトをインスタンス化するたびに、あなたはObject.createでこれを置き換えることができるかもしれません。

適用される一般規則があります。

+0

多分私は高密度ですが、Object.createとnewのどちらを使用するのかまだ分かりません。 Object.createの使用に関するコード例を示し、newがうまくいかなかった理由を説明できますか? – jfriend00

+6

@ jfriend00:コンストラクタ関数の唯一の目的が、別のオブジェクトから継承する空のオブジェクトを作成することであれば、 'Object.create'を使用します。 –

+0

それは、感謝を助ける。それは、別のオブジェクトのプロトタイプを継承する新しいオブジェクトを作成するために使用されるYUI extend()の言語サポートされたバージョンのようです。そうですか? – jfriend00

3

既に言及したように、Object.create()は、新しいオブジェクトのプロトタイプを簡単に設定する場合によく使用されます。しかし、他の答えが言及しなかったのは、コンストラクタ関数(新しいものを必要とする)が他の関数と全く異なるわけではないということです。

実際には、任意の関数がオブジェクトを返すことができます。コンストラクタなどのファクトリ関数を表示するにはJavaScriptでよくありますが、newを必要とせず、thisを使用して新しいオブジェクトを参照します。ファクトリ関数は、多くの場合、Object.create()を使用して新しいオブジェクトのプロトタイプを設定します。

var barPrototype = { 
    open: function open() { /* ... */ }, 
    close: function close() { /* ... */ }, 
}; 
function createBar() { 
    return Object.create(barPrototype); 
} 

var bar = createBar(); 
2

このスレッドにスーパー後半..しかし、私が行う必要がある重要な違いは、コンストラクタだけで機能している一方で、new演算子は、関数を呼び出し、に有用であることができ、その結果のオブジェクトをキャプチャしていることだと思いますダイナミックな環境。状況によっては、コンストラクタの実行中にプロパティやメソッドを参照することもできますが、これは有用であるかもしれません。もしあなたがセットのプロトタイプを持っていることにもっと関心がありますが、オブジェクトそのものが静的ではない場合、Object.createはより洗練された選択肢になります。 。

いくつかの簡単な例..

var Foo = function(element) { 
    this.elem = element; 
    $(this.elem).css('color', 'blue'); 
    // using the new operator here gives access to this.elem 
    // immediately after that declaration is made, thus providing 
    // a comfortable dynamic system to work with 
} 

var bar = new Foo(someElem); 

に並置として..

var foo = { 
    elem : element,    // assume elem exists 
    $(this.elem).css('color', 'blue')// in the lexical scope 
} 

var bar = Object.create(foo); 
// This.elem does not exist until the object is returned now 
// and the .css method call will not execute 

あなたが別の簡単な内訳として、他の上で1つを使用したいと思う理由を少し明確にする必要があります。..

ダイナミックオブジェクトを気にして、プロトタイプチェーンについて気にしないときは、Newを使用してください。

動的であることを気にする必要がなく、明示的なプロトタイプチェーンを持つことについては、Object.createを使用してください。 Object.createで作成されたオブジェクトも、initというメソッドを使用して動的に構築できることに注意してください。このメソッドをビルドして、必要に応じてプロパティを割り当て、新しく返されたオブジェクトで呼び出すことができます。

それぞれのアプローチには不調和がありますが、私の考えでは、そのユースケースはかなり異なっています。しかし、ほとんどの場合、動的ではない状況があり、継承の必要性が増してくるため、Object.createを使用している可能性が高くなります。

0

Object.create()関数の正確なソースコードは次のとおりです。

function Object.Create(proto, propertiesObject) 
{ 
    var obj = {}; 

    Object.setPrototypeOf(obj, proto); 

    if(propertiesObject) 
    { 
     Object.defineProperties(obj, propertiesObject); 
    } 

    return obj; 
} 
関連する問題