間に違いはありますか
var a= {
grade: "A",
price: 10
};
と
function functionObj(){
this.grade="A";
this.price=10;
}
var a = new functionObj();
間に違いはありますか
var a= {
grade: "A",
price: 10
};
と
function functionObj(){
this.grade="A";
this.price=10;
}
var a = new functionObj();
最初のものは 1 回限りのものです。他のオブジェクトと共通点がない単一のオブジェクトを作成します (もちろん、すべてのオブジェクトに共通するものは除きます)。
2 つ目はコンストラクター関数を使用します。コンストラクター関数の便利な点の 1 つは、コンストラクター関数を使用して構築されたオブジェクトにオブジェクトのプロトタイプとして割り当てられるオブジェクトがあることです。これは、独自のコピーを持たないオブジェクトのプロパティを参照すると、エンジンはオブジェクトのプロトタイプを調べて、それがあるかどうかを確認することを意味します。これは、JavaScript のプロトタイプの継承の基礎です。
たとえば、2 番目の形式では、共有プロトタイプを介して共有特性を持つ複数のオブジェクトを作成できます。
具体例:
function Circle(r) { // Constructor function names are initially capitalized by convention
this.radius = r;
}
Circle.prototype.area = function() {
return this.radius * this.radius * Math.PI;
};
Circle.prototype.circumference = function() {
return this.radius * 2 * Math.PI;
};
Circle.prototype.name = "Circle";
var c1 = new Circle(10);
console.log(c1.name); // "Circle"
console.log(c1.area()); // 314.1592653589793
var c2 = new Circle(5);
console.log(c2.name); // "Circle"
console.log(c2.area()); // 78.53981633974483
そこで、c1
およびc2
オブジェクトはプロパティを継承し、それらの共有プロトタイプから および を継承します。このように作成した各オブジェクトは、作成時にプロトタイプを取得します。それに割り当てられるプロトタイプは、それを行うときに指しているオブジェクトです。ご覧のとおり、プロトタイプのプロパティは、関数を含め、あらゆるものを参照できます。area
circumference
new Circle
Circle.prototype
ECMAScript の第 5 版が登場して以来、プロトタイプを使用するためにコンストラクター関数を使用する必要はありません。次の方法でプロトタイプを直接割り当てることができますObject.create
。
var circlePrototype = {
area: function() {
return this.radius * this.radius * Math.PI;
},
circumference: function() {
return this.radius * 2 * Math.PI;
},
name: "Circle"
};
var c1 = Object.create(circlePrototype);
c1.radius = 10;
console.log(c1.name); // "Circle"
console.log(c1.area()); // 314.1592653589793
var c2 = Object.create(circlePrototype);
c1.radius = 5;
console.log(c2.name); // "Circle"
console.log(c2.area()); // 78.53981633974483
コンストラクター関数は、すべての部分 (プロトタイプと初期化ロジック) を 1 つの整頓された場所に保持します。コンストラクター関数の欠点は、プロトタイプの継承を「クラスのような」方法で見る傾向があることです。クラスのような継承は便利で人気がありますが、町で唯一のゲームではありません。アドホックな別のオブジェクトの前にあるファサードであるオブジェクトを作成したいことは珍しくありませんObject.create
。そのような状況には最適です。