2015-07-11 28 views
0

我是javascript的新手,我想知道爲什麼bob.age仍然是30,而age是50,當我調用它。我已將age設置爲setAge中的50,this.age,我知道它是bob.age的參考號,所以agebob.age應該具有相同的值。使用JS對象和函數

enter image description here

// here we define our method using "this", before we even introduce bob 
var setAge = function (newAge) { 
    this.age = newAge; 
}; 
// now we make bob 
var bob = new Object(); 
bob.age = 30; 
// and down here we just use the method we already made 

// change bob's age to 50 here 
bob.setAge = setAge(50); 
+0

請在問題本身的代碼,而不是隻是一個形象,所以它更容易爲人們在他們的答案複製 –

回答

4

bob.setAge = setAge(50);

所有正在做的是將bob的setAge屬性設置爲調用setAge(50)的結果 - 因爲setAge retunrs undefined,所以您已經有效地設置了bob.SetAge = undefined。也許你究竟想要做的是

bob.setAge = setAge; 
bob.setAge(50); 

未經檢驗的,但我認爲這是正確的

+0

http://jsfiddle.net/5kqvfz5f/這是正確的 –

+0

等待你爲什麼需要分配setAge to bob.setAge? – Ricardo

+0

你的意思是相反,將bob.setAge賦值給setAge - 請參閱ChadF的更完整答案以獲得解釋 –

7

還有就是在你的代碼/認識的幾個誤區,我要開始這是爲什麼特別錯誤的,解釋周圍的概念

var bob = new Object()正在使bob成爲一個常規物體。

您的setAge函數需要一個參數。它將this.age設置爲該值。但是,setAge放置在全局範圍內。因此this - >window。這就是爲什麼當你在全球範圍內輸入age時你得到了50個。

Jaromanda是正確的,你需要將函數setAge放到對象bob上。

如果您與this玩弄你可能有興趣在pseudoclassical實例化風格:

var Person = function(name, age) { 
    this.name = name; 
    this.age = age; 
} 

Person.prototype.setAge = function(newAge) { 
    this.age = newAge; 
} 

var bob = new Person ('Bob', 30); 
bob.setAge(50); 
bob.age; 
// 50 
+0

' - >'很可能誤導新手。我建議將它改爲標準的'//評論' –

+0

這讓我更困惑 – Ricardo

+0

@ZachSaucier謝謝!做出改變。 – ChadF

1

關鍵字這個作爲一個佔位符,將是指哪個對象調用該方法當該方法被實際使用時。

看看setAge方法,看看它是如何工作的。通過使用關鍵字,setAge將更改調用它的任何對象的age屬性。

然後當我們說bob.setAge = setAge;這意味着只要我們輸入bob.setAge()this.age in setAge方法將參考bob.age。

+1

]我認爲你只是混淆了bob.setAge這是一個屬性bob和setAge這是一個函數。因此,當您將bob.setAge分配給setAge時,意味着bob.setAge由setAge定義,並且可以通過將值傳遞給參數來訪問setAgefunction。 bob.setAge(20); – Ricardo