2013-02-13 61 views
0

基礎通行證對象作爲函數參數

  • toplevelOBJ對象在整個申請中使用的如this.toplevelOBJ,其中I能夠訪問它的屬性,諸如,例如this.toplevelOBJ.mapArea.coordX
  • ClassB有一個叫做blink函數等待信號從外部源。
  • ClassC我需要捕捉到這個信號,所以我成立了一個功能,captureClassC來檢索ClassB

問題

發送的信號,當通過capture()功能發送到ClassC"this" in this.toplevelOBJ不再是指toplevelOBJ,而是ClassC

正因爲如此,我送this.toplevelOBJ作爲參數toplevel通過capture()功能,但在接收,我不知道如果從toplevelOBJ一個函數被調用:toplevel.update(),而我可以訪問它的屬性:toplevel.mapArea.coordX

QUESTION

當通過Object發送作爲參數,是Object完全相同?因爲當我檢查了Object,我發現update()功能toplevel.__proto__.__proto__下,然而,我發現它的屬性立刻:toplevel.mapArea


代碼

// Class in which I am sending the object 
var ClassB = exports.ClassB = ClassA.extend({ 
    blink: function(key, value) { 
     ClassC.prototype.capture(key, value, this.toplevelOBJ); 
    } 
}); 

// Class in which I am receiving the object 
var ClassC = exports.ClassC = ClassA.extend({ 
    capture: function(key, value, toplevel) { 
     /* Run Function of toplevel */ 
    } 
}); 
+2

'this'的值由每個函數調用的情況決定。對我來說,這使得你的整個問題非常混亂。對我而言,「頂級對象」是指「全局對象」,在這種情況下,不需要通過this來訪問它。 – Pointy 2013-02-13 15:59:08

回答

0

最通常的方式,這是照顧在課堂上是存儲適當的this在t實例化的時間。這樣做的最常見的方式是這樣:

function SomeClass 
{ 
var that = this; 
that.myVariable = 5; 

that.someFunction = function() 
{ 
    return that.myVariable; 
} 
} 

你也有包裝/代理方法,如在下劃線庫bind功能,可以「強制」的this變量解釋。見http://underscorejs.org/#bind

我更喜歡這兩種方法而不是強制this變量由調用者。

0

是的,當你傳遞一個對象作爲參數時,它是完全一樣的。

它甚至不是對象的精確副本,它實際上是相同的對象。該參數只是對該對象的引用,因此該對象從不被複制。


的屬性和方法可以是對象自身的部件或者在原型鏈的部件。在你的情況下,mapArea屬性是對象本身的成員,而update方法是原型或對象的成員,即toplevelOBJ對象的原型。