2015-12-06 55 views
4

功能這是我有:傳遞一個對象的它的另一個功能

var Person = function(fname, lname) { 
     this.fname = fname; 
     this.lname = lname; 
    }; 

    Person.prototype = { 
     getFullName: function() { 
      return this.fname + " " + this.lname; 
     }, 
     doStuff: function(stuff) { 
      return stuff(); 
     } 
    }; 

var john = new Person("John", "Doe"); 

doStuff功能的工作原理與其他功能,但這樣做下面的回報undefined undefined

console.log(john.doStuff(john.getFullName)); 

這有什麼錯我有什麼,以及如何改變它以使其工作? 謝謝。

+0

嘗試在'getFullName()'函數中執行'console.log(this)'並查看它回調的內容;) – saadq

+1

如果只接收它自己的方法,則可以傳遞一個字符串'john.doStuff 「getFullName」)',然後執行'return this [stuff]();'。或者你可以做到這一點,如果你得到一個字符串,它會嘗試使用它作爲方法名稱,否則它會調用它。 –

回答

4

這是因爲this沒有指向的對象。

您可以使用​​以設定的this值:

john.doStuff(john.getFullName.bind(john)); 

然而,這並不是很靈活,因此你可以只在doStuff方法內將其綁定:

doStuff: function(stuff) { 
    return stuff.apply(this); 
} 
+0

謝謝!正是我在找什麼。 – Yulek

+0

@Julek如果任何參數被傳遞,我會建議使用Paul的答案。 –

2

如果你知道的foo.doStuff ARG總是想上foo被調用,您可以在doStuff

// ... 
    doStuff: function (stuff) { 
     return stuff.apply(this, Array.prototype.slice.call(arguments, 1)); 
    } 
相關問題