3

我想要習慣JavaScript的「真實」原型繼承(ECMAScript 5),但不知何故,我的思想似乎被困在經典的繼承模式中。原型繼承和靜態方法

我想創建執行簡單的操作,如加,減等Vector對象

現在有兩種方案:

  • #1:添加矢量B「至」載體A(矢量一個被修改的)
  • #2:添加矢量B 「到」 載體B(在創建新的向量C,其是A的總和與B)

在經典遺傳我想CR吃掉了場景#1的實例方法和案例#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); 

感謝您的諮詢!

更新

這是我試圖實現使用保羅的意見靜態函數(謝謝!):

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' 

回答

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

+0

嗨,非常感謝您的建議和鏈接!我試圖實現一個靜態函數(請參閱我的問題中的更新),這是「正確」的方式嗎? – sled

+0

是的,看起來不錯:) – Paul

+0

在類似的情況下,我的靜態方法已經連接到「prototype」(vectorPrototype)我可以繼承sublcass(Vector)還是應該在我的子類中定義它?謝謝 –