Answer the question
In order to leave comments, you need to log in
Javascript: String.prototype.namespace.method and this
For a long time now I've been wanting to do something like this:
String.prototype.utils = {
append : function(value){
return this + value;
}
}
String.prototype.utils = function(){
var $this = this;
return {
append : function(value){
return this + value;
}
}
}
'one-'.utils.append('two')
Answer the question
In order to leave comments, you need to log in
It is impossible, because Your utils object won't know about the context (this is something undefined for it).
But if you want perversions, then you can
// https://gist.github.com/947203
(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('!'));
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question