あなたは実際にいくつかの異なる質問をしています。それでは、最初のものに集中させてください (変数名を変更して、変数名をより簡単に参照し、上書きしないようにしますObject
)。
正確には次の違いは何ですか:
function ObjA() {
this.a = 'text';
}
var objA = new ObjA();
と
function ObjB() {
return {
a: 'text'
};
}
var objB = new ObjB();
違いは、前のバージョンではプロトタイプ チェーンが維持されるのに対し、後のバージョンではプロトタイプ チェーンが破棄されることです。次のコード行を検討してください。
ObjA.prototype.b = "something";
ObjB.prototype.b = "something";
次に、次が true になります。
objA.b; //is "something"
objB.b; //is undefined
その理由は、「コンストラクター」から返されたオブジェクトが ObjB のプロトタイプ チェーンを追加しないためです。新品のオブジェです。それが「違い」です。
2 番目の例 (.prototype
オブジェクトを使用する場合と返す場合) は、実際には私の知る限り、メモリを実際に「無駄にする」ことはありません(更新を参照)。関数で演算子を呼び出すプロセスはnew
、オブジェクトのプロトタイプのコピーを作成してから、その関数を呼び出すためです。良い点は、 を使用すると、プロトタイプ化されたメソッドが「コンストラクター」関数内で使用可能になり.prototype
、そのバージョンでプロトタイプ チェーンを維持できることです。しかし、リターンベースのメソッドを使用することについて本当に「間違っている」ことがあるかどうかはわかりません。
アップデート:
私はこの件に関する ECMAScript 仕様を調べました (そして私の思考装置に少し油を差しました) が、メモリの浪費について私が間違っていたようです。「クラス」関数のプロトタイプ プロパティのメソッド/プロパティが参照によってリンクされているようです。したがって、プロトタイプを使用するのではなく、新しいオブジェクトを生成するために、実際には少しのメモリが浪費されます。さらに、返されたオブジェクトで宣言されたプロパティはすべてインスタンス レベルですが、プロトタイプ オブジェクトで宣言されたプロパティは「クラス」に対して静的です (つまり、すべてのインスタンスで共有されます)。
そして、他の人が指摘したように、あなたの例には小さなバグがあります(a
プロトタイプオブジェクトでは利用できません)。しかし、それは当面の質問には重要ではないので、無視しました。(バグを修正したようです)。