Иногда мы бываем просто ленивыми. Особенно, когда доходит дело до написания кода. И хоть круглые скобки в вызове функции не приводят к избыточности, иногда все же они могут утомлять, особенно когда javascript-метод не нуждается в передаваемых ему аргументах. Иногда это просто надоедает.
Как ни странно, все это не тяжело делать в языке Javascript, как и большинство других методов, которые вызывается… toString — вероятно один из немалоизвестных, но также, как и valueOf, который делает более-менее то же самое, но касательно числовых (и некоторых других) типов в языке JavaScript.
Наиболее простой вариант его вызова, включая знак «плюс»:
что фактичесски обозначает:
Так, все что нам надо сделать, это заставить метод valueOf запускать на выполение функцию, переданную ему:
… и вдруг знак «плюс» становится всем, что нам нужно для этого вызова.
Особенно в ООП, вы можете иметь очень много подобных вызовов, но можно исправить эти методы таким образом, чтобы они вызывались в рамках самого метода:
Используя данный метод в конструкторе, можно сделать обертку:
или немножко автомазировав:
и наконец, закончим полным примером (после маленького ООП-рефакторинга):
Как ни странно, все это не тяжело делать в языке 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);
};
и наконец, закончим полным примером (после маленького ООП-рефакторинга):
- var StandardClass=function(){};
-
- StandardClass.prototype.initMethods=function(){
- for(var i in this)
- if(typeof(this[i])==”function” && this[i].dontWrap!==true)
- this[i]=this[i].fix(this);
- };
-
- StandardClass.prototype.initMethods.dontWrap=true;
-
- Function.prototype.fix=function(s){
- var t=this;
- return function(){
- return t.apply(s,arguments);
- };
- };
-
- Function.prototype.valueOf=function(){
- this.call(this);
- return 0;
- };
-
- var Foo=function(name){
- this.initMethods();
- this.name=name;
- };
-
- Foo.prototype=new StandardClass;
-
- Foo.prototype.showName=function(){
- alert(this.name);
- };
-
- Foo.prototype.showNameUpperCase=function(){
- alert(this.name.toUpperCase());
- };
-
- var myFoo=new Foo(“Hello World”);
-
- +myFoo.showName;
- +myFoo.showNameUpperCase;
* This source code was highlighted with Source Code Highlighter.