これらの機能の動作に違いはありますか?最初のものは、コンストラクタを考えるときに私が考えるもののより典型的なものです。コンストラクタを使用してオブジェクトを作成する方法とオブジェクトを返す方法の違いはありますか?
例1:を使用して、を使用してプロパティの名前を付けて設定します。次にnewを使用して新しいBookオブジェクトを作成します。
function Book(name, numPages) {
this.name = name;
this.numPages = numPages;
}
var myBook = new Book('A Good Book', '500 pages');
例2:新しいを使用して、オブジェクトを返すだけの機能自体を呼び出します。
function Movie(name, numMinutes) {
return { name:name, numMinutes:numMinutes };
}
var best = new Movie('Forrest Gump', '150');
var other = Movie('Gladiator', '180');
私が理解しようとしているのは、これらがオブジェクトを作成する方法が異なる場合です。もしそうなら、他のものよりも優れていますか?誰かが他の人よりもうまくいく異なる状況がありますか?
リテラルを返すと、コンストラクタ関数の '.prototype' propsで継承が提供されません。継承が必要な場合は、 "new" +コンストラクタを使用します。そうでない場合は、2番目のコードのようなファクトリを使用します。 – dandavis
2番目のスニペットでは、 'new'は無視されます。 'Movie.prototype'から継承した空のオブジェクトが不必要に作成されます。ファクトリ関数で 'new'を使わないでください。そして、いいえ、彼らは同じように動作しません。 – Bergi
もう1つは使用しないでください。ここでMovie.prototypeから継承することはもうありません。例えば 'other/best instanceof Movie // false false'を返します。私はこれを読むことをお勧めします:https://zetafleet.com/blog/2014/12/back-to-basics-javascript-functions-constructors-and-this-demystified.html#ref-5 – Kiechlus