実際、JavaScriptでオブジェクトを作成する方法はいくつかあります。オブジェクトを作成したいだけの場合、「new」演算子を使用して「コンストラクタベースの」オブジェクトを作成するメリットはありません。「オブジェクトリテラル」構文を使用してオブジェクトを作成するのと同じです。しかし、「プロトタイプの継承」について考えていると、「new」演算子で作成された「コンストラクタベースの」オブジェクトが信じられないほど使用されます。リテラル構文で作成されたオブジェクトの継承チェーンは維持できません。ただし、コンストラクター関数を作成し、そのプロトタイプにプロパティとメソッドをアタッチできます。"演算子、それはそのコンストラクター関数のプロトタイプに添付されたすべてのメソッドとプロパティにアクセスできるオブジェクトを返します。
コンストラクター関数を使用してオブジェクトを作成する例を次に示します(下部のコードの説明を参照)。
function Person(firstname, lastname) {
this.firstname = firstname;
this.lastname = lastname;
}
Person.prototype.fullname = function() {
console.log(this.firstname + ' ' + this.lastname);
}
var zubaer = new Person('Zubaer', 'Ahammed');
var john = new Person('John', 'Doe');
zubaer.fullname();
john.fullname();
これで、Person構築関数をインスタンス化することで、必要な数のオブジェクトを作成でき、それらすべてからfullname()が継承されます。
注:「this」キーワードはコンストラクター関数内の空のオブジェクトを参照し、「new」演算子を使用してPersonから新しいオブジェクトを作成すると、「this」キーワードが付加されたすべてのプロパティとメソッドを含むオブジェクトを自動的に返します。そして、これらのオブジェクトは確実に、Personコンストラクター関数のプロトタイプにアタッチされたメソッドとプロパティを継承します(これがこのアプローチの主な利点です)。
ちなみに、「オブジェクトリテラル」構文で同じ機能を取得したい場合は、以下のようにすべてのオブジェクトにfullname()を作成する必要があります。
var zubaer = {
firstname: 'Zubaer',
lastname: 'Ahammed',
fullname: function() {
console.log(this.firstname + ' ' + this.lastname);
}
};
var john= {
firstname: 'John',
lastname: 'Doe',
fullname: function() {
console.log(this.firstname + ' ' + this.lastname);
}
};
zubaer.fullname();
john.fullname();
最後に、なぜオブジェクトリテラルアプローチではなくコンストラクタ関数アプローチを使用する必要があるのかを尋ねた場合:
***プロトタイプの継承により、非常に便利で強力な継承の単純なチェーンが可能になります。
***コンストラクター関数プロトタイプで定義された共通のメソッドとプロパティを継承することにより、メモリを節約します。それ以外の場合は、すべてのオブジェクトでそれらを何度もコピーする必要があります。
これが理にかなっているといいのですが。
a = new Object
、a = new Object()
、a = {}
、リテラルがはるかに簡単であると私はしばらく前に走ったいくつかのテストは、それが高速であると言う、新しいコンパイラは私の文は偽であることを引き起こしている可能性があります。同じことがリテラル配列にも当てはまります