我必須有,在那裏你忘記一切:)
雖然@ 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')
您仍然可以使用上下文選擇器來更改引用對象。
+1精彩的回答。應該有更多的投票。 – User2