У меня, должно быть, один из тех дней, когда ты все забываешь :)
Хотя ответ @ 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')
Вы все еще можете использовать контекстный селектор для изменения ссылочного объекта.