JavaScript の「本物の」プロトタイプ継承 (ECMAScript 5) に慣れようとしていますが、どういうわけか私の心は古典的な継承パターンにとらわれているようです。
加算、減算などの単純な操作を実行する Vector オブジェクトを作成したいと思います。
現在、次の 2 つのシナリオがあります。
- #1: ベクター B をベクター A に追加する (ベクター A が変更される)
- #2: ベクトル B を「」ベクトル B に追加 (A と B の合計である新しいベクトル C が作成されます)
古典的な継承では、シナリオ 1 のインスタンス メソッドとケース 2 の静的メソッドを作成しますが、プロトタイプの継承には静的関数がないようです。
では、これら 2 つのシナリオを実現するためのクリーンな方法は何でしょうか?
ここに私がこれまでに持っているものがあります:
var Vector = {
x: 0,
y: 0,
z: 0,
initialize: function(x,y,z) {
this.x = x;
this.y = y;
this.z = z;
return this;
},
add: function(vec) {
this.x += vec.x;
this.y += vec.y;
this.z += vec.z;
return this;
},
print: function() {
console.log('x:', this.x, 'y:', this.y, 'z:', this.z);
}
};
var firstVector = Object.create(Vector).initialize(1,2,3);
var secondVector = Object.create(Vector).initialize(4,5,6);
firstVector.print(); // Outputs: x:1, y:2, z:3
secondVector.print(); // Outputs: x:4, y:5, z:6
firstVector.add(secondVector);
firstVector.print(); // Outputs: x:5,y:7,z:9
// What I'm looking for:
var thirdVector = Vector.add(firstVector, secondVector);
アドバイスをありがとう!
更新:
これは、Paul のアドバイスを使用して静的関数を実装しようとする私の試みです (ありがとう!):
var vectorPrototype = {
hello: function() { console.log('hello I am the prototype'); }
};
var Vector = Object.create(vectorPrototype);
Vector.hello = function() { console.log('hello I am the static function'); };
Vector.init = function() {
return Object.create(vectorPrototype);
}
var vec1 = Vector.init();
vec1.hello(); // says: 'hello I am the prototype'
Vector.hello(); // says: 'hello I am the static function'