2013-10-24 52 views
2

新建JS ..誰能告訴我,如果使用,這是在下面的函數相應:使用此Javascript的

var Vector = (function()... 

this.prototype.add = function(someVector2){ 

    var tmpVect = this; 
    tmpVector.x += someVector2.x; 
    tmpVector.y += someVector2.y; 
    return tmpVect; 
}; 

在這個意義上,「無功tmpVect =這」將導致本地矢量變量與調用函數的矢量的y屬性?

乾杯

+0

您可以將'x'和'y'分配給'this',所以我不明白爲什麼需要另外引用它。 – Brian

+3

'var tmpVect = this'不會創建一個新的Vector。它只是創建另一個**參考**到同一個。 – Pointy

+0

是的,這很酷,我不想另外改變向量來調用它,只是爲了返回一個結果向量。 –

回答

1

我想改寫這個像這樣:(根據您的意見)

var Vector = function(){ 

} 

Vector.prototype.add = function(someVector2){ 
    var tmpVector = new Vector; 
    tmpVector.x = this.x + someVector2.x; 
    tmpVector.y = this.y + someVector2.y; 

    return tmpVector; 
} 

然後,你可以調用它像這樣:

var someVector = new Vector(); 
var addedVector = someVector.add(someVector); 

以上將存儲新在addedVector中的向量將具有xy的值,是someVector的兩倍。

+0

這是我原來的問題的一個很好的答案。儘管在你的add函數中,最好不要返回新的Vector(this.x + ...,this.y + ...)?乾杯! –

1

新對象只能以非常明確的方式聲明; 「new Vector()」或「variable = {x:5,y:2}」等等。每當你寫「something = somethingElse」時,沒有新的對象將被創建。您甚至可以使用三等於比較器來確認此情況。

v1 = new Vector(1, 2); 
v2 = new Vector(1, 2); 
v1 === v2 // will return false 

v3 = v1; 
v1 === v3 // will return true 

v1.x = 17; 
v3.x // will return 17 

爲了便於開發,您可以定義一個Vector原型函數「克隆」,創建並返回一個「new Vector()」具有相同x和y作爲原始。如果你想要一個新的add()的回報,你需要做那樣的事情。

此外:ryan的答案是切線正確的 - 你應該只定義一次原型函數,而不是每次創建一個Vector。

+0

我不同意明確創建對象。最臭名昭着的是'function(){}',它總是創建一個相當重的對象,但是人們甚至可以在循環或者函數中執行它,因爲每個程序只能執行一次。 – Esailija

+0

嗯,我不太認爲包括免責聲明 - 但我的答案主要集中在理解對象的函數式編程以及如何設計程序的方面;不理解內存管理和性能考慮。通常,有人可能通過製作龐大複雜的程序而不知道正在重新創建函數的事實;他們在分析時可能只是有一些工作要做。 – Katana314

1

以下是我將如何寫它。它也有一個技巧,我從大衛赫爾曼讀到關於使你的構造函數new不可知論者。這意味着您不一定必須用new關鍵字製作新的Vector

function Vector(x,y) { 
    // Make the constructor `new` agnostic 
    if (!(this instanceof Vector)) { 
    return new Vector(x,y); 
    } 

    this.x = x; 
    this.y = y; 

    return this; 
} 

Vector.prototype.add = function(someVector2) { 
    this.x += someVector2.x; 
    this.y += someVector2.y; 

    return this; 
}; 

// Example 
var myVector = new Vector(1,2); 
var myOtherVector = Vector(1,2); 

myVector.add(myOtherVector); 
+0

它具有顯着的性能損失http://jsperf.com/123412314。如果您在使用'new'嚴格模式和jshint時遇到問題。 – Esailija