2016-03-19 48 views
0

我只是想知道我是否可以讓我的一些幫助函數(例如長凳,日誌記錄和緩存等)有點整齊。現在我在做這個你能得到一個方法的對象嗎?

function doSomethingToMethodsObject(object, methodname) { 
    //do things to object and object[methodname] 
} 

這樣我就可以這樣使用它

var myObject = function() { 
    this.myString = "hello"; 
    this.myMethod = function() { return this.myString; }.bind(this); 
    doSomethingToMethodsObject(this, "myMethod"); 
} 

,但它會更好,如果我可以這樣稱呼它

doSomethingToMethodsObject(this.myMethod); 

再突破將函數引用放到doSomethingToMethodsObject中,然後放入「myMethod」。

那麼有沒有辦法找出一個函數屬於什麼對象?

+0

分配'this'到變量和使用它像'變種自=此;'' 此。myMethod = function(){return self.myString; } .bind(selft);' –

+1

對'對象'做的事情究竟是什麼? – Bergi

回答

1

那麼有沒有辦法找出函數屬於哪個對象?

函數不只屬於一個對象。在很多不同的對象上可以有很多對同一個函數的引用。所以,不,你不能通過純粹看功能來具體弄清楚函數屬於哪個對象。

事實上,爲什麼你通過this.myMethod作爲論點,沒有任何連接this傳遞的部分。它只是獲得對該函數的引用並將其傳遞給它。

您可以使用.bind()將函數的綁定引用傳遞給函數,但只允許您在正確對象的上下文中調用該方法 - 它不允許您將該對象從方法中分離出來。如果你需要在你的函數中分別使用對象和方法,那麼你需要找到一些方法使它們在函數內部分別可訪問 - 最明顯的方法就是將它們作爲參數傳遞。

根據具體的上下文(你並不真正分享很多),有時你可以使用父範圍變量,如var self = this;來維護對子函數可以訪問的this的引用,但我不是當然,這適用於你在做什麼。

這裏有一些選擇:

doSomethingToMethodsObject(this, this.myMethod); 

doSomethingToMethodsObject({obj: this, method: this.myMethod}); 
0

當您使用this.myMethod,JS創建的基數爲this,其引用的名字是"myMethod"參考。

但是,當您將它用作參數時,JS會將引用解析爲屬性值。因此,在doSomethingToMethodsObject中,獲得基礎爲時已晚。

獲得this.myMethod的基數的唯一方法是當myMethod是一個訪問器屬性,它具有重定向到基礎對象值的getter屬性。然後,您可以在吸氣劑中使用this,並將其存儲在基礎值的屬性中。

例如:

var obj = { 
    _myMethod: function(arg) { /* Underlying function */ 
    return {thisArg: this, arg: arg}; 
    }, 
    get myMethod() { /* Stores reference parts and redirects */ 
    return Object.assign(this._myMethod, { 
     refBase: this, 
     refName: "_myMethod" 
    }); 
    } 
}; 
function doSomethingToMethodsObject(value) { 
    return value.call(
    value.refBase, 
    value === value.refBase[value.refName] 
); 
} 
obj.myMethod(123); // {thisArg: obj, arg: 123} 
doSomethingToMethodsObject(obj.myMethod); // {thisArg: obj, arg: true} 
+0

當然,這種方法破壞了正常的'this.myMethod()'調用 – Bergi

+0

@Bergi好點。我猜getter可能會返回一個將調用重定向到'_myMethod'(或'_myMethod'本身)的函數,並將'this'存儲爲該函數的一個屬性。 – Oriol

相關問題