2010-01-24 33 views
15

¿Hay alguna manera de agregar un método a todas las funciones de javascript sin usar la biblioteca de prototipos?javascript ¿Agregar método prototipo a todas las funciones?

algo en la línea de:

Function.prototype.methodName = function(){ 


    return dowhateverto(this) 

}; 

esto es lo que he intentado hasta ahora, pero no funcionó. Quizás también es una mala idea, si es así, ¿podría decirme por qué?

caso afirmativo, puedo agregarlo a un conjunto de funciones i elegir

algo como:

MyFunctions.prototype.methodName = function(){ 


    return dowhateverto(this) 

}; 

donde MyFunctions es una matriz de nombres de función

gracias

+0

http://www.packtpub.com/article/using-prototype-property-in-javascript – jjj

+1

Extender objetos de JavaScript incorporados es una mala práctica. – jerone

Respuesta

25

Sure. Las funciones son objetos:

var foo = function() {}; 

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

foo.bar(); 

alertará "barra"

+0

Este fragmento de código supone que 'foo' ha sido declarado previamente, o bien' foo' es un global implícito (¡malo!). Quizás cambie la declaración de declaración a 'var foo = function() {};' para reforzar las buenas prácticas ...? –

+0

Bueno, no es exactamente un buen estilo para modificar el prototipo de objetos base en primer lugar. Pero estoy de acuerdo. – troelskn

1
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 
1

Cambio de JS objetos integrados le puede dar algunas sorpresas.
Si agrega bibliotecas externas o cambia la versión de una de ellas, nunca estará seguro de que no sobrescribirán su extensión.

+0

Su enlace está muerto. – luckydonald

+0

@luckydonald, gracias por el comentario – Mic

1

Trate Object.prototype lugar:

Object.prototype.methodName = function(){ 

    return dowhateverto(this) 
}; 

Pero también prestar atención a la advertencia de que la extensión de los objetos nativos no siempre es una buena idea.

Function.prototype realmente no se puede manipular confiablemente en Javascript; no es un objeto real, porque el constructor Function() necesita devolver una función, no un objeto. Pero tampoco puedes tratarlo como una función normal. Su comportamiento cuando intenta acceder a sus 'propiedades' puede no estar definido y variar entre los navegadores. Vea también this question.

Cuestiones relacionadas