tags:

views:

116

answers:

4

Is there a way to add a method to all javascript functions without using the prototype library?

something along the lines of :

Function.prototype.methodName = function(){ 


  return dowhateverto(this) 

 };

this is what i tried so far but it didnt work. Perhaps it is a bad idea also if so could you please tell me why?

if so can I add it to a set of functions i choose

something like :

MyFunctions.prototype.methodName = function(){ 


  return dowhateverto(this) 

 };

where MyFunctions is an array of function names

thank you

A: 
function one(){
    alert(1);
}
function two(){
    alert(2);
}

var myFunctionNames = ["one", "two"];

for(var i=0; i<myFunctionNames.length; i++) {
    // reference the window object, 
    // since the functions 'one' and 'two are in global scope
    Function.prototype[myFunctionNames[i]] = window[myFunctionNames[i]];
}


function foo(){}

foo.two(); // will alert 2
Luca Matteis
+5  A: 

Sure. Functions are objects:

var foo = function() {};

Function.prototype.bar = function() {
  alert("bar");
};

foo.bar();

Will alert "bar"

troelskn
This code snippet assumes that `foo` has been declared previously, or else `foo` is an implied global (bad!). Perhaps change the declaration statement to `var foo = function() {};` to reinforce good practice...?
Steve Harrison
Well, it's not exactly good style to modify the prototype of base objects in the first place. But I concur.
troelskn
+1  A: 

Changing JS built-in objects can give you some surprises.
If you add external libraries or changing the version of one of them, you are never sure that they won't overwrite your extension.

In my opinion it is safer to build your own functions or may be use something like: http://github.com/jdalton/fusebox to, in a way, sandbox them.

Mic
A: 

Try Object.prototype instead:

Object.prototype.methodName = function(){ 

  return dowhateverto(this) 
};

But also heed the warning that extending native objects is not always a good idea.

Function.prototype can't really be manipulated reliably in Javascript; it isn't a real object, because Function() constructor needs to return a function, not an object. But, you can't treat it like a normal function either. Its behaviour when you try to access its 'properties' may be undefined and vary between browsers. See also this question.

thomasrutter