Pull to refresh

Вызов метода Javascript без его вызова фактически

Reading time2 min
Views3.4K
Original author: Admin
imageИногда мы бываем просто ленивыми. Особенно, когда доходит дело до написания кода. И хоть круглые скобки в вызове функции не приводят к избыточности, иногда все же они могут утомлять, особенно когда javascript-метод не нуждается в передаваемых ему аргументах. Иногда это просто надоедает.

Как ни странно, все это не тяжело делать в языке Javascript, как и большинство других методов, которые вызывается… toString — вероятно один из немалоизвестных, но также, как и valueOf, который делает более-менее то же самое, но касательно числовых (и некоторых других) типов в языке JavaScript.

Наиболее простой вариант его вызова, включая знак «плюс»:

+myFunction;


что фактичесски обозначает:

window.parseFloat(myFunction.valueOf());


Так, все что нам надо сделать, это заставить метод valueOf запускать на выполение функцию, переданную ему:

Function.prototype.valueOf=function(){this.call(this); return 0;};


… и вдруг знак «плюс» становится всем, что нам нужно для этого вызова.

Особенно в ООП, вы можете иметь очень много подобных вызовов, но можно исправить эти методы таким образом, чтобы они вызывались в рамках самого метода:

Function.prototype.fix=function(s){var t=this; return function(){ return t.apply(s,arguments); }; };


Используя данный метод в конструкторе, можно сделать обертку:

var Foo=function(){
this.myMethod=this.myMethod.fix(this);
};



или немножко автомазировав:
var Foo=function(){
for(var i in this)
if(typeof(this[i])=="function")
this[i]=this[i].fix(this);
};


и наконец, закончим полным примером (после маленького ООП-рефакторинга):

  1. var StandardClass=function(){};
  2.  
  3. StandardClass.prototype.initMethods=function(){
  4.   for(var i in this)
  5.      if(typeof(this[i])==”function” && this[i].dontWrap!==true)
  6.          this[i]=this[i].fix(this);
  7. };
  8.  
  9. StandardClass.prototype.initMethods.dontWrap=true;
  10.  
  11. Function.prototype.fix=function(s){
  12.   var t=this;
  13.   return function(){
  14.      return t.apply(s,arguments);
  15.   };
  16. };
  17.  
  18. Function.prototype.valueOf=function(){
  19.   this.call(this);
  20.   return 0;
  21. };
  22.  
  23. var Foo=function(name){
  24.   this.initMethods();
  25.   this.name=name;
  26. };
  27.  
  28. Foo.prototype=new StandardClass;
  29.  
  30. Foo.prototype.showName=function(){
  31.   alert(this.name);
  32. };
  33.  
  34. Foo.prototype.showNameUpperCase=function(){
  35.   alert(this.name.toUpperCase());
  36. };
  37.  
  38. var myFoo=new Foo(“Hello World”);
  39.  
  40. +myFoo.showName;
  41. +myFoo.showNameUpperCase;
* This source code was highlighted with Source Code Highlighter.
Tags:
Hubs:
Total votes 84: ↑57 and ↓27+30
Comments49

Articles