2017-08-07 29 views
3

Noob問題,搜索但沒有找到這個特定問題的答案。 我構造的對象,並使用「這個」關鍵字引用參數的參數:在對象方法中使用這種冗餘的Javascript嗎?

function Obj(a, b, c) { 
    this.a = a; 
    this.b = b; 
    this.c = c; 
    this.addMe = function() { 
    alert(this.a + this.b + this.c); 
    }; 
} 

我的問題是一個簡單的一個:如果A,B,和C中的對象內單獨存在(在換句話說,沒有使用相同名稱聲明的全局變量),是在addMe()方法中使用它們時需要的'this'關鍵字嗎?難道該方法不能簡單地寫爲:

this.addMe = function() { 
    alert(a + b + c); 
}; 

當我通過創建obj的新實例運行這段代碼,它的工作原理完全相同的兩種方式。如果我爲a,b和c創建全局變量的值與我在實例化新的Obj時使用的參數的值不同,那麼(不是我會這麼做),這些對方法調用的結果沒有影響。那麼,如果我不在方法中使用「this」,我是否錯過了會回來咬我的東西?

+5

的差異/問題那要看什麼'了''B'和'C'是,如果有一個機會,他們」在某個時候會被重新分配。如果「這個」版本從不重新分配,它們應該實際上是相同的。 – Carcigenicate

+0

如果您想從方法中獲取實例的初始狀態,那麼您將通過參數返回數學。我想從方法中獲取實例的當前狀態,然後通過對象的屬性返回數學運算。 – Teemu

+0

就像'@ Carcigenicate'所說的那樣,但既然你把這些作爲公共財產,你就會想用'this',因爲重新分配是一種選擇。 – PHPglue

回答

0

用你定義addMe函數的方式,是的;你可以簡單地關閉abc並使用它們。然而,問題在於,這通常是定義您的方法的浪費方式,因爲每實例化Obj將涉及構建新的addMe函數。

通常,人們傾向於在構造函數之外將可重用方法附加到構造函數之外,方法是依靠ES6類語法或執行Obj.prototype.addMe = ...。在這兩種情況下,構造函數參數a,bc都不在範圍內,因此您必須依賴this中的可用屬性。

1

如果你知道this.a(例如)將永遠不會被重新分配,那麼是的,他們應該有效地是相同的。

這是一個如果不過。如果你後來忘記了你打算不再重新分配他們呢?然後你有一個奇怪的錯誤,可能很難追查。

實施例:

function Obj(a) { 
 
    this.a = a; 
 

 
    this.show = function() { 
 
    console.log(this.a); 
 
    console.log(a) 
 
    }; 
 
} 
 

 
var obj = new Obj(1); 
 
obj.show(); 
 

 
obj.a = 2; 
 
obj.show(); // OOPS!

注意,要show第二呼叫將給出兩個不同的值。 show函數創建一個關閉圍繞原始值a;從本質上保存它。當this.a被重新分配時,它保持不變。

除非你有充分的理由不要,只需使用this。明確表達你的意圖通常是在有疑問時要走的路。節省一些擊鍵是很少值得頭痛的。

+0

只是爲了補充一點,發生這種情況的原因是因爲關閉。當定義函數'this.show'時,在函數創建時(即'1'),JavaScript有效地將'a'替換爲'a'的狀態。當將其更改爲2時,'a'從內部引用的功能仍然是1. –

+0

好通話。我會看看我是否可以在某個地方適應。 – Carcigenicate

1

爲了證明使用a + b + c

function Obj(a, b, c) { 
 
    this.a = a; 
 
    this.b = b; 
 
    this.c = c; 
 
    this.addMe = function() { 
 
    console.log('addMe', this.a + this.b + this.c); 
 
    }; 
 
    this.brokenAddMe = function() { 
 
    console.log('brokenAddMe', a + b + c); 
 
    }; 
 
} 
 
var o = new Obj(1,2,3); 
 
o.addMe(); // should be and is 6 
 
o.brokenAddMe(); // should be and is 6 
 
o.a = 4; 
 
o.addMe(); // should be and is 9 
 
o.brokenAddMe(); // should be 9 but still is 6

+0

總體意義。感謝你的回答。正如我所說,noob。 – TKD

相關問題