私は Codeacademy に取り組んでいますが、両方を書かなければならないことが示されています。しかし、なぜ両方が必要なのかは説明されていません。
2 に答える
コンストラクターは、オブジェクトにアイデンティティーを与えます。これは基本的に、再利用可能な作成方法の青写真です。これは、従来の OOP のクラスと非常によく似ており、よく混同されます。
頻繁に「車」オブジェクトの束があり、すべての車によく使用されるメソッドまたはプロパティがある場合は、カプセル化するのに役立つ Car コンストラクターを作成できます。
function Car(numPassengers) {
this.numPassengers = numPassengers;
}
Car.prototype = {
accelerate: function () {
// blah
},
brake: function () {
// blah
}
};
var jetta = new Car(4);
var bmwZ4 = new Car(2);
オブジェクト リテラルは、構造と作成を再利用する必要のないジャスト イン タイム オブジェクトを渡す方法です。従来の OOP と比較すると、Java の Map に似ています (ただし、javascript オブジェクト リテラルは引き続きメソッドを持つことができます)。一般的な使用例は、可能なパラメーターの束を取る関数ですが、それぞれはオプションです。
function someActionThatTakesOptionalParams(options) {
if (options.doAlert) {
alert(options.doAlert);
}
if (options.someOtherProperty) {
// do some work
}
}
someActionThatTakesOptionalParams({
doAlert: 'this will show up in an alert box',
someOtherProperty: 5,
hello: 'world'
});
また、メソッドがアタッチされていない別のものに渡されるデータをモデル化するための便利な方法でもあります。たとえば、JSON を受け取る API があるとします。
$.ajax({
url: 'someApiEndpoint',
method: 'get',
params: {
x: 5,
y: 10
}
});
愚かな質問ではありません。実際、Object コンストラクター、特に Array コンストラクターは扱いにくい場合があります。これらのコンストラクターは異なるセマンティクスを持つ異なるパラメーターを使用するため、微妙なバグが発生する可能性があるためです。
推奨される方法は、リテラル{}
と[]
MDN言います:
> new Array(element0, element1, ..., elementN)
> new Array(arrayLength)
最初の文は配列を構築し、すべての引数をそこにプッシュします。2 番目の文は、長さ = arrayLength の配列を構築します。たまたま整数である単一の要素を持つ配列を構築してプッシュしようとするとどうなりますか? ガッチャ!