3

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'
4

1 に答える 1

2

あなたのVectorオブジェクトは本当にただのプロトタイプです。Object.create関数と一緒に使用して、Vector基本/サブクラスを作成できます。Vector次に、新しく作成したクラスに静的プロパティを貼り付けます。ここを参照してください:http://jsfiddle.net/agYNc/1/

var vectorPrototype = {

  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);
  }
};

//create your base Vector type
var Vector = Object.create( vectorPrototype );


//Your static functions here
Vector.staticFunction = function ( vec1, vec2 ) {};


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​

Object.createこれは、継承、静的、およびインスタンス プロパティで使用する良い例です。https://github.com/webadvanced/takeCommand/blob/master/src/takeCommand.module.js

于 2012-08-25T00:26:09.627 に答える