2016-04-28 54 views
0

我有一個JavaScript對象是這樣的:如何從函數訪問其他屬性值作爲JavaScript中的對象屬性值?

var ali = { firstname: 'ali', 
      say_hi: function(firstname) { 
      alert("Greetings " + firstname + ", you are talking to " + this.firstname + "!"); 
    } 
}; 

var some_ref = ali.say_hi; 
some_ref("Sabir"); 

它告誡:

Greetings Sabir, you are talking to undefined! 

但我想這一點:

Greetings Sabir, you are talking to ali! 

我認爲self.firstname指窗口對象,因此它給未定義。

任何人都可以請幫我理解這個問題以及如何解決它?

回答

1

是什麼這個問題,如何解決

this的值取決於函數是如何。通過將函數分配給變量並將其稱爲f(),this將引用全局對象(或在嚴格模式下爲undefined)。由於沒有名稱爲firstname的全局變量,因此this.firstname將解析爲undefined

如果你想this指一個特定的對象,你可以.bind功能:

var some_ref = ali.say_hi.bind(ali); 

要了解更多關於this,看看一些許多互聯網引用:

0

不使用this只是ali.firstname它會正常工作

var ali = { 
 
    firstname: 'ali', 
 
    say_hi: function(firstname) { 
 
    alert("Greetings " + firstname + ", you are talking to " + ali.firstname + "!"); 
 
    } 
 
}; 
 
var some_ref = ali.say_hi; 
 
some_ref("Sabir");

+0

什麼用 '這個' 關鍵詞一點改進? –

1

要理解爲什麼它返回undefined而不是ali,你要明白的JavaScript綁定

如果您通過引用而不是直接通過其所有者對象訪問方法(與您一樣),該方法會丟失其隱式綁定,並且會停止引用其所有者對象並返回其默認綁定,這意味着全局對象(或嚴格模式下的undefined)。

最終,重要的是該函數的調用方式。

請參閱以下更多的信息(也有例外,但它通常可以概括爲以下):

Breakdown from YDKJS: Determining this

現在,我們可以總結的規則從確定這個函數調用的呼叫站點,按其優先順序排列。按照此順序提出這些問題,並在第一條規則適用時停止。

  1. 被稱爲新的功能(新結合)?如果是這樣,這是新構建的對象。

    • VAR欄=新富()
  2. 被稱爲與呼叫或應用(明確結合)的功能,竟然隱藏着一個綁定硬約束力裏面?如果是這樣,這是明確指定的對象。

    • var bar = foo。呼叫(OBJ2)
  3. 是(隱式綁定)稱爲與上下文的功能,或者稱爲擁有或含有對象?如果是這樣,那就是那個上下文對象。

    • 變種條= obj1.foo()
  4. 否則,默認情況下,該(缺省綁定)。如果在嚴格模式下,選擇未定義,否則選擇全局對象。

    • 變種條= FOO()

注意:在ES6,this詞法this脂肪箭頭功能=>和與對象速記符號(例如,sampleMethod() {} ),這意味着this將作爲參考的外部環境。

0

我建議你使用對象構造,以避免重複var ali = ...代碼,當你做出新的人。我基於以下代碼Eloquent JavaScript

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

 
Person.prototype.say_hi = function(greeter_name) { 
 
    alert("Greetings " + greeter_name + ", you are talking to " + this.firstname + "!"); 
 
} 
 

 
var ali = new Person("Ali"); 
 

 
ali.say_hi("Sabir");

+0

雖然這確實有用,但它並不能解釋OP所具有的問題。 –

+0

'this.propertyName'通常用在構造函數中,所以我重寫了OP打算對構造函數做什麼。 –

+0

但你完全忽略'var some_ref = ali.say_hi; some_ref(「Sabir」);'問題,這仍然是您的解決方案的問題。 –

相關問題