2011-08-22 19 views
2

這聽起來有點不同尋常,我從來沒有必要用這種方式使用方括號表示法,並且絞盡腦汁我無法想出產生期望結果的方法。Javascript方括號表示法多個動態屬性

我實施回調包裝傳遞方法作爲回調

例如當保持this基準

foo.prototype.wrap = function(name){ 
    var wrapper, 
     self = this; 

    wrapper = function(){ 
     self[name](arguments); 
    }; 

    return wrapper; 
}; 

// usage 

foo.wrap('bar'); 

// executes foo.bar maintaining 'this' as a reference to foo 

我遇到的問題是,FOO有一些嵌套的方法

例如

foo.bar.close(); 

我試圖找出一種方法,使wrap方法支持嵌套方法

例如

foo.wrap('bar.close') 

// or 

foo.wrap('bar','close'); 

所以foo.wrap功能將需要動態地添加對應於長度或傳入的方括號內的自變量。

例如

self[x][y][z](arguments); 

我想不出有辦法做到這一點。有任何想法嗎 ?

我有一個偷偷摸摸的懷疑,但這是不可能的。

回答

5

我必須有,在那裏你忘記一切:)

雖然@ NilColor的答案是正確的一個日子,我也知道,我只是不與正確的帽子思考。

無論如何,我決定我仍然喜歡有一個包裝,當你把它附加到你的對象時需要少一點特異性的想法。而且有點不詳細。

所以我把它和我的原始思路一起寫下來,你可能會喜歡它。

myObj.wrap = function(path, context){ 
    var wrapper, 
     method = (typeof path != 'string' && context)? path : this, 
     context = (typeof path === 'object' && context === undefined)? 
      path : (context || this); 

    if (typeof path === 'string'){ 
     path = path.split('.'); 

     for (var i = 0; i < path.length; i++){ 
      method = method[path[i]]; 
      if (context === true ) 
       context = (i === path.length - 2)? method : context; 
     }; 
    }; 

    wrapper = function(){ 
     method.apply(context, arguments); 
    }; 

    return wrapper; 
} 

用法:

綁定任何數目的嵌套方法MyObj中

myObj.wrap('foo') //binds myObj.foo to myObj 

// or 

    myObj.wrap('foo.bar') //binds myObj.foo.bar to myObj 

//or if myObj is a function 

    myFunc.wrap() // binds myFunc to myFunc 

綁定MyObj中的一個方法到另一個對象

myObj.wrap('foo.bar', someObj) //binds myObj.foo.bar to someObj 

//or if myObj is a function 

    myFunc.wrap(someObj) //Binds myFunc to someObj 

綁定嵌套方法到它的父

myObj.wrap('foo.bar', true) // binds myObj.foo.bar to myObj.foo 

用作輔助

myObj.wrap(someFunc, someObj) //binds someFunc to someObj 

如果您在方法結合的背景下尋找一個答案,原來的問題沒有。

myObj.getProps = function(path, context){ 
var context = context || this; 
    path = path.split('.'); 


for (var i = 0; i < path.length; i++){ 
      context = context[path[i]]; 
    }; 

    return context; 
}; 

用法:

附加到對象或作爲一個獨立的功能

獲取屬性

myObj.getProps('foo.bar') // returns mayObj.foo.bar 

給它一個上下文對象

myObj.getProps('user.name', myAccounts) // returns myAccounts.user.name 

使用它作爲一個獨立的功能代替

myObj.getProps = function(path,context){....} 

function getProps(path,context){....} 

注意

如果使用它作爲一個獨立的功能,你需要記住,它將會開始從尋找範圍爲this。因此,如果它在全球範圍內定義,則需要提供完整路徑。

例如

getProps('myObj.foo.bar') 

您仍然可以使用上下文選擇器來更改引用對象。

+0

+1精彩的回答。應該有更多的投票。 – User2

3

A的 「結合」 一般概念this是這樣的:

function bind(method, context) { 
     var args = Array.prototype.slice.call(arguments, 2); 
     return function() { 
      var a = args.concat(
           Array.prototype.slice.call(arguments, 0)); 
      return method.apply(context, a); 
     } 
} 

這樣你會得到與聯thiscontext)提述method。這樣,您可以綁定像這樣的嵌套方法:

> foo = {} 
> foo.a = function(){console.log('a'); console.log(this)} 
> bar = {bar: 'yeah'} 
> f = bind(foo.a, bar) 
> f() 
-> a 
-> {bar: 'yeah', __proto__: Object} 

它是您正在尋找的東西嗎?

+0

這工作得很好,謝謝。 – AshHeskes

+0

對不起,我沒有選擇你的答案,不是因爲它錯了,而是因爲我更準確地回答了我的上述問題。 – AshHeskes

+0

它可以幫助你。沒關係。不知道爲什麼你已經把它解決了......無論如何,祝你好運。 – NilColor