2012-10-03 14 views
5

Sé que esto está mal visto, solo estaba explorando la idea y por mi vida no puede hacer que esto funcione de la manera que yo también lo quisiera.Simplemente curiosidad por subclase del objeto String. (prototípicamente)

El ejemplo debe explicar todos:

String.prototype.MyNS = function() {} 
String.prototype.MyNS.fooify = function() { 
    return this + 'foo!'; 
} 

var theString = 'Kung'; 

alert(theString.MyNS.fooify()); 

Por supuesto, esto simplemente añada la definición de la función de 'foo' ... la adición de este) trabajo (en lugar no funciona.

Entiendo que he perdido el contexto pero no puedo imaginar cómo hacer que el original se dispare y darme lo que quiero.

+0

relacionados: http://stackoverflow.com/questions/7141734/extending-core-types-without-modifying-prototype? – valentinas

Respuesta

7

He aquí una manera que podría hacerlo:

String.prototype.MyNS = function() { 
    var _this = this; 
    return { 
     fooify: function() { 
      return _this + 'foo!'; 
     } 
    }; 
} 

Véalo in action on jsFiddle

Nota, como slashingweapon señala, que va a tener que llamarlo así:

String.prototype.MyNS().fooify(); 

Por lo que yo sé, no hay una forma de navegador cruzado para hacerlo sin tener que llamar al MyNS como una función.

+1

Pero tiene que llamarlo como '" lo que sea ".MYS(). Fooify();' – slashingweapon

+0

¡Lo amo! Desearía no tener que llamarlo así, pero al menos funciona ... ¡gracias! –

+0

Cuál es correcto: 'String.prototype.MyNS(). Fooify()' O 'String.MyNS(). Fooify()'? La respuesta se refiere al comentario de @slashingweapon, pero luego se refiere a una sintaxis diferente. – jahroy

1

va a añadir un nuevo function (class en términos oo) a la Stringprototype y no tiene acceso a la String instancia real.

Se podía añadir la propiedad directamente al prototipo:

String.prototype.fooify = function() { 
    return this + 'foo!'; 
} 
var theString = 'Kung'; 
alert(theString.fooify()); 
Cuestiones relacionadas