2013-07-18 47 views
13

問題:爲什麼問候函數不會返回期望值?

爲什麼問候函數不返回期望值?

代碼:

function Person(name){ 
    this.name = name; 
} 

Person.prototype.greet = function(otherName){ 
    return "Hi" + otherName + ", my name is " + name; 
} 

我怎麼回答這個問題?我創建一個新的人,那麼我該怎麼做?

var John = new Person("John"); 

回答

24

錯誤的訪問方法。變量name未定義,只定義了this.name。所以它正在尋找名爲name的函數範圍內的變量,而不是名爲name的對象的屬性。

要從對象中訪問對象的屬性,我們使用this關鍵字。因此我們需要使用this.name來訪問下面實現中的name屬性。

Person.prototype.greet = function(otherName){ 
    return "Hi" + otherName + ", my name is " + this.name; 
} 
+0

對象屬性分辨率無關範圍。 「錯誤的範圍」這個短語會更好,因爲「錯誤的訪問方法」。 – RobG

+0

夠公平的。編輯。 –

+0

感謝您的幫助 – flylib

0

您需要更改greet函數與this關鍵字使用對象的名稱:

Person.prototype.greet = function(otherName){ 
    return "Hi" + otherName + ", my name is " + this.name; 
} 

後,只需撥打John.greet("other name");

+0

感謝您的幫助 – flylib

4

在您的代碼:

> function Person(name) { 
>  this.name = name; 
> } 

當作爲構造函數調用時,上面將創建一個名爲n名爲的實例名稱併爲其分配名稱的值參數。

> Person.prototype.greet = function(otherName){ 
>  return "Hi" + otherName + ", my name is " + name; 
> } 

這裏標識符作爲一個變量,但你正在尋找的標識是實例的命名屬性,所以你需要這樣來訪問它。通常情況下,這個函數將作爲實例的一個方法調用,所以這個內的函數將會被實例引用。所以,你想:

 return "Hi" + otherName + ", my name is " + this.name; 

所以,現在當你可以做(​​注意開頭大寫字母的變量是,按照慣例,爲construtors保留):

> var john = new Person("John"); 

然後:

john.greet('Fred'); 

因爲映入眼簾被稱爲約翰的方法,它將返回:

Hi Fred, my name is John 
+0

感謝您的幫助 – flylib

1

或者,因爲這是範圍繼承的問題(沒有訪問變量「名字」第二個功能),我們可以改寫代碼看起來像這樣,包括它所有的人作用下:

function Person(name){ 
    this.name = name; 
    this.greet = function(otherName){ 
     return "Hi" + otherName + ", my name is " + name; 
    } 
} 

也適用。

0

嘗試以下操作:

function Person(name){ 
    this.name = name; 
    this.greet = function(otherName){ 
     return "Hi " + otherName + ", my name is " + name; 
    } 
} 

Person("Joe") 
greet("Kate") 
相關問題