Skip to content

Instantly share code, notes, and snippets.

@artsobolev
Created April 28, 2011 20:09
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save artsobolev/947203 to your computer and use it in GitHub Desktop.
Save artsobolev/947203 to your computer and use it in GitHub Desktop.
(function(){
var _utils = { // String.prototype.utils
append : function(tail){
return this + tail;
}
},
utils = {}, // фронтэнд. на этот объект будут навешены геттеры.
// на _utils геттеры вешать нельзя т.к. тогда мы не сможем (вроде как) добраться до методов
self = null, // тут будет контекст
generateGetter = function(fnc){ // это геттер
return function(){ // геттер возвращает функцию
return function(){ // которая при вызове возвращает
// результат применения соответствующего метода с нужным контекстом
return _utils[fnc].apply(self, arguments);
};
};
};
for(var prop in _utils){ // смотрим все методы _utils
if(_utils.hasOwnProperty(prop)){
// и назначаем для них геттеры для нашего фронтэнд объекта
utils.__defineGetter__(prop, generateGetter(prop));
}
}
// Геттер на String.prototype, который вернет наш презентационный объект
// Когда кому-нибудь захочется обратиться к какому-нибудь методу этого объекта,
// обьявленному в _utils, он попадет на геттер
String.prototype.__defineGetter__('utils', function(){
self = this;
return utils;
});
})();
// Пример
console.log('Hello'.utils.append(' World'));
console.log('Hello'.utils.append(' World')
.utils.append('!'));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment