2009-07-02 24 views
9

Estoy seguro de haber formulado esta pregunta incorrectamente, pero no sé cómo explicarlo bien ...¿Puedo agregar una función pública a objetos en JavaScript? ¿Cómo?

Tengo una vaga idea que he leído en alguna parte que puedo agregar métodos a objetos en JavaScript - por lo que quiero decir algo como:

function Exclaimify(aString) 
{ 
    return aString + "!"; 
} 

var greeting = "Hello"; 
alert(greeting.Exclaimify()) // this shows "Hello!" in an alert box 

¿Esto es posible? Si es así, ¿cómo lo hago?

+0

Dos comentarios rápidos: (1) No hay necesidad de la cadena (este), ya sabes "esto" es una cadena ya que estás en un String.prototype función; (2) No agregue nada a Object.prototype o Array.prototype. Si lo hace, ya no puede usar la sintaxis "for (var item in array)". –

+0

@John Kugelman: corregido, gracias. – MGOwen

+0

No extienda su pregunta con su propia respuesta. Si cree que es necesaria una respuesta por separado, publique su propia respuesta a continuación. –

Respuesta

24

Asignar a ella simplemente como si fuera una variable. Entonces puede usar this. ¡Fácil!

var obj = {foo: "bar"}; 

obj.someFunc = function() 
{ 
    return this.foo; 
} 

Eso funciona genial ... excepto! Er, excepto, no en cuerdas, que son inmunes a esta tontería. (Son completamente inmutables.) Sin embargo, hay otra manera, que es modificar la "clase" del objeto y agregar el método allí. Y por "clase" realmente quiero decir "prototipo". JavaScript doesn't have classes, it has prototypes. La sintaxis para modificar el prototipo String se ve así:

var greeting = "Hello"; 

String.prototype.Exclaimify = function() 
{ 
    return this + "!"; 
} 

alert(greeting.Exclaimify()) // this shows "Hello!" in an alert box 
+0

brillante: exactamente lo que buscaba. – MGOwen

4

Parece que desea utilizar la técnica llamada monkey patching. Ese artículo contiene un enlace al Duck Punching JavaScript - Metaprogramming with Prototype que puede ayudarlo.

+0

Gracias. Sus artículos vinculados no fueron tan concisos como la respuesta aceptada, pero aún se ven. – MGOwen

+0

Si bien esto podría responder teóricamente a la pregunta, [sería preferible] (http://meta.stackexchange.com/q/8259) incluir aquí las partes esenciales de la respuesta y proporcionar el enlace de referencia. –

Cuestiones relacionadas