私はnew
これまでJavaScriptでキーワードを使用してきました。私はこれまで読んでいましたがObject.create
、代わりにそれを使うべきかどうか疑問に思います。よくわからないのは、構築コードを実行する必要があることが多いためObject.create
、関数の実行がトリガーされないため、どのように機能するのかまったくわかりません。
誰か教えてもらえますか?その場合、Object.create
代わりに使用する必要がありnew
ますか?
私はnew
これまでJavaScriptでキーワードを使用してきました。私はこれまで読んでいましたがObject.create
、代わりにそれを使うべきかどうか疑問に思います。よくわからないのは、構築コードを実行する必要があることが多いためObject.create
、関数の実行がトリガーされないため、どのように機能するのかまったくわかりません。
誰か教えてもらえますか?その場合、Object.create
代わりに使用する必要がありnew
ますか?
これまでのところ、オブジェクトを作成する場合は、リテラルのみを使用できます。
var obj = {};
またはObject
コンストラクター。
var obj = Object();
ただし、これらのメソッドでは、作成されたオブジェクトのプロトタイプを指定することはできません。
これがあなたが今できることですObject.create
。これにより、新しいオブジェクトを作成し、最初の引数を新しいオブジェクトのプロトタイプとして設定できます。さらに、2番目の引数として提供される新しいオブジェクトのプロパティを設定できます。
これは、次のようなことを行うのと似ています(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(){};
コンストラクター関数があり、そこから1つのオブジェクトのみをインスタンス化する場合は常に、これを。に置き換えることができる場合がありますObject.create
。
適用される一般的なルールがあります。コンストラクター関数が何をしているのか、他のオブジェクトからどのように継承するのかなどに大きく依存します。
すでに述べたようObject.create()
に、新しいオブジェクトのプロトタイプを簡単に設定する方法が必要な場合によく使用されます。ただし、他の回答では言及されていないのは、コンストラクター関数(newが必要)は他の関数とそれほど変わらないということです。
実際、どの関数もオブジェクトを返すことができ、JavaScriptではファクトリ関数を表示するのが一般的です(コンストラクターのようですが、新しいオブジェクトを参照するためにnew
使用する必要はありません)。this
ファクトリ関数Object.create()
は、新しいオブジェクトのプロトタイプを設定するためによく使用されます。
var barPrototype = {
open: function open() { /* ... */ },
close: function close() { /* ... */ },
};
function createBar() {
return Object.create(barPrototype);
}
var bar = createBar();
このスレッドには非常に遅れていますが、重要な違いは、コンストラクターは単なる関数であるのに対し、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
別の簡単な内訳として、なぜ一方を他方の上に使用したいかが少し明確になるはずです...
プロトタイプチェーンではなく動的オブジェクトを使用する場合は、[新規]を使用します
動的であることに関心がなく、明示的なプロトタイプチェーンを持つことに関心がある場合は、Object.createを使用します。init
また、Object.createで作成されたオブジェクトは、必要に応じてプロパティを割り当て、新しく返されたオブジェクトで呼び出すことができるというメソッドを使用して動的に構築できることにも注意してください。
それぞれのアプローチには浮き沈みがありますが、私の意見ではそれらのユースケースはかなり異なります。ただし、ほとんどの状況では動的性の低い状況が必要になり、継承の必要性が高くなるため、Object.createを使用している可能性があります。
Object.create()関数の正確なソースコードは次のとおりです。
function Object.Create(proto, propertiesObject)
{
var obj = {};
Object.setPrototypeOf(obj, proto);
if(propertiesObject)
{
Object.defineProperties(obj, propertiesObject);
}
return obj;
}