0

関数ManAのように新しいオブジェクトを作成することと、コンストラクターManBを呼び出すこととの間に違いはありますか?

function ManA(name, age)
{
    return { name: name, age: age, getAge: function() { return this.age; } };
}

function ManB(name, age)
{
    this.name = name;
    this.age = age;
    this.getAge = function() { return this.age; };
}

var manA = ManA("Tom", 28);
var manB = new ManB("Frank", 25);

ありがとう

4

1 に答える 1

3

違いは、manA [[Ptototype]]チェーンが次のとおりであることです。

manA -> Object.prototype -> null

manB [[Prototype]]チェーンは次のとおりです。

manB -> ManB.prototype -> Object.prototype -> null

したがって、2番目のケースでは、メソッドをに追加することで、メソッドmanB(およびのすべてのインスタンスManB)を追加できますManB.prototype。インスタンスではそれを行うことはできませんManA[注を参照]。したがって、getAgeメソッドはコンストラクターのプロトタイプ上にあり、インスタンスごとに数バイトのメモリを節約できます。

ノート

manAプロトタイプチェーンにメソッドを追加できますがObject.prototype、使用できるのは。だけなので、すべてのオブジェクトがメソッドを継承します。これは非常に悪いスタイルと見なされるため、組み込みオブジェクトはそのままにしておく必要があります。

于 2012-12-02T20:38:12.850 に答える