2011-01-14 15 views
1
function distance(r,t){ 
     this.rate = r, 
     this.time = t, 
     this.calculate = function() {return rate * time ;}; 
     return this; 
} 

var trip1 = distance(2,4); 
var trip2 = distance(5,7); 
var trip3 = distance(3,10); 
document.write("<br>trip1: " + trip1.calculate()); 
document.write("<br>trip2: " + trip2.calculate()); 
document.write("<br>trip3: " + trip3.calculate()); 

輸出中JavaScript和這個

trip1: 30 
trip2: 30 
trip3: 30 

不應輸出是

trip1: 8 
trip2: 35 
trip3: 30 

回答

5

每個新的距離應爲新的對象。此外,內部計算,你必須用「這個」 keywork

function distance(r,t){ 
     this.rate = r, 
     this.time = t, 
     this.calculate = function() {return this.rate * this.time ;}; 
     return this; 
} 

var trip1 = new distance(2,4); 
var trip2 = new distance(5,7); 
var trip3 = new distance(3,10); 
document.write("<br>trip1: " + trip1.calculate()); 
document.write("<br>trip2: " + trip2.calculate()); 
document.write("<br>trip3: " + trip3.calculate()); 

編輯上面的例子沒有新的關鍵字來引用當前實例:

function distance(r,t){ 
     if (!(this instanceof distance)) //checking if I'm using 'new' or not 
      return new distance(r, t); 
     this.rate = r, 
     this.time = t, 
     this.calculate = function() {return this.rate * this.time ;}; 
     return this; 
} 

var trip1 = distance(2,4); 
var trip2 = distance(5,7); 
var trip3 = distance(3,10); 
document.write("<br>trip1: " + trip1.calculate()); 
document.write("<br>trip2: " + trip2.calculate()); 
document.write("<br>trip3: " + trip3.calculate()); 
+0

道格拉斯克羅克福德建議不要在任何情況下使用`new`運算符。 :) – 2011-01-14 09:43:32

+0

大聲笑..這是正確的:) ..遠離新的! – stecb 2011-01-14 10:07:46

1

在你的函數distance()你在全局的window對象上設置ratetime屬性,因爲您沒有使用new運算符實例化旅程對象。 return this函數內部返回window對象,所以基本上,你覆蓋了三次屬性。

正確的解決方案由@steweb給出。

編輯:添加例如無new關鍵字:

var createTripObject = function(rate, time) { 
    var r = rate, t = time; 
    return { 
    calculate: function() { return r * t; } 
    }; 
}; 

var trip1 = createTripObject(2, 4); 
var trip2 = createTripObject(5, 7); 
document.write('<br/>trip1: ' + trip1.calculate()); 
document.write('<br/>trip2: ' + trip2.calculate()); 

的方法返回一個新的對象,可以acccess局部變量的對象範圍內,但距離範圍之內不可用,基本上是建立僞私有成員。

+0

如何做到上面沒有新的關鍵字? – Apotheosis 2011-01-14 09:03:14

0

this對象是當前上下文的「所有者」。在你的distance函數中,所有者將是全局對象,換句話說就是window對象。因此,當您多次撥打distance()時,每個調用將覆蓋window對象中以前的值r,tcalculate

要將每個行程變量創建爲單獨的對象,請使用new關鍵字。

var trip1 = new distance(2,4); 
0

從Krof Drakula的答案OP報價:

「怎麼做上面沒有新的新關鍵字?」

然後只需訪問參數。它會工作。

function distance(rate, time) { 
    return { 
     calculate: function() { return rate * time; } 
    }; 
} 

如果您需要訪問ratetime財產,無論是獲取和設置,你可以把它定義爲對象的一部分。

function distance(rate, time) { 
    return { 
     rate: rate, 
     time: time, 
     calculate: function() { return this.rate * this.time; } 
    }; 
}