爲什麼問候函數不返回期望值?
代碼:
function Person(name){
this.name = name;
}
Person.prototype.greet = function(otherName){
return "Hi" + otherName + ", my name is " + name;
}
我怎麼回答這個問題?我創建一個新的人,那麼我該怎麼做?
var John = new Person("John");
爲什麼問候函數不返回期望值?
代碼:
function Person(name){
this.name = name;
}
Person.prototype.greet = function(otherName){
return "Hi" + otherName + ", my name is " + name;
}
我怎麼回答這個問題?我創建一個新的人,那麼我該怎麼做?
var John = new Person("John");
錯誤的訪問方法。變量name
未定義,只定義了this.name
。所以它正在尋找名爲name
的函數範圍內的變量,而不是名爲name
的對象的屬性。
要從對象中訪問對象的屬性,我們使用this
關鍵字。因此我們需要使用this.name
來訪問下面實現中的name
屬性。
Person.prototype.greet = function(otherName){
return "Hi" + otherName + ", my name is " + this.name;
}
您需要更改greet函數與this
關鍵字使用對象的名稱:
Person.prototype.greet = function(otherName){
return "Hi" + otherName + ", my name is " + this.name;
}
後,只需撥打John.greet("other name");
感謝您的幫助 – flylib
在您的代碼:
> 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
感謝您的幫助 – flylib
或者,因爲這是範圍繼承的問題(沒有訪問變量「名字」第二個功能),我們可以改寫代碼看起來像這樣,包括它所有的人作用下:
function Person(name){
this.name = name;
this.greet = function(otherName){
return "Hi" + otherName + ", my name is " + name;
}
}
也適用。
嘗試以下操作:
function Person(name){
this.name = name;
this.greet = function(otherName){
return "Hi " + otherName + ", my name is " + name;
}
}
Person("Joe")
greet("Kate")
對象屬性分辨率無關範圍。 「錯誤的範圍」這個短語會更好,因爲「錯誤的訪問方法」。 – RobG
夠公平的。編輯。 –
感謝您的幫助 – flylib