21

単純なJS継承を考えると、これら2つの例の基本関数の実際的な違いは何ですか?言い換えれば、プロトタイプではなく「これ」で関数を定義することを選択する必要があるのはいつですか(またはその逆)?

私にとって、2番目の例は消化しやすいですが、これにはどれだけ多くのことがありますか?

これで定義された関数:

//base
var _base = function () {
    this.baseFunction = function () {
        console.log("Hello from base function");
    }
};
//inherit from base
function _ctor() {
    this.property1 = "my property value";
};
_ctor.prototype = new _base();
_ctor.prototype.constructor = _ctor;
//get an instance
var instance = new _ctor();
console.log(instance.baseFunction);

プロトタイプで定義された関数:

//base
var _base = function () {};
_base.prototype.baseFunction = function () {
    console.log("Hello from base function");
}
//inherit from base
function _ctor() {
    this.property1 = "my property value";
};
_ctor.prototype = new _base();
_ctor.prototype.constructor = _ctor;
//get an instance
var instance = new _ctor();
console.log(instance.baseFunction);
4

1 に答える 1

42

プロトタイプの関数は一度だけ作成され、各インスタンス間で共有されます。コンストラクターで作成された関数は、コンストラクターで作成された新しいオブジェクトごとに新しいオブジェクトとして作成されます。

原則として、関数は同じタイプの異なるオブジェクトに対して変更されないため、プロトタイプ上にある必要があります。これには、メモリ/パフォーマンスにわずかな利点があります。共有の静的プロパティを作成する場合を除き、オブジェクトや配列などの他のプロパティはコンストラクターで定義する必要があります。作成する場合は、プロトタイプを使用する必要があります。

関数ではなく、通常のオブジェクトまたは配列との違いを簡単に確認できます

function Foo(){
    this.bar = [];
}
var fooObj1 = new Foo();
var fooObj2 = new Foo();

fooObj1.bar.push("x");
alert(fooObj2.bar) //[]

とは対照的に:

function Foo(){
}

Foo.prototype.bar = []
var fooObj1 = new Foo();
var fooObj2 = new Foo();

fooObj1.bar.push("x");
alert(fooObj2.bar) //["x"]
于 2013-03-27T12:46:20.307 に答える