2012-10-03 8 views
5

So che questo è disapprovato, stavo solo esplorando l'idea e per la vita di me non riesco a fare questo lavoro nel modo in cui lo vorrei anch'io.Solo curioso di sapere come creare una sottoclasse di oggetti String. (prototipicamente)

L'esempio dovrebbe spiegare tutto:

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

var theString = 'Kung'; 

alert(theString.MyNS.fooify()); 

Naturalmente questo è sufficiente aggiungere il definizione della funzione di 'foo' ... l'aggiunta di questa() opera invece pretende molto.

Capisco che ho perso il contesto, ma non riesco a capire come far sparire l'originale e darmi quello che voglio.

+0

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

risposta

7

Ecco un modo si potrebbe fare:

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

Guardalo in action on jsFiddle

nota, come sottolinea slashingweapon, che si dovrà chiamare in questo modo:

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

Per quanto ne so, non esiste un modo cross-browser per farlo senza dover chiamare MyNS come una funzione.

+1

Ma devi chiamarlo come "qualsiasi cosa" .MyNS(). Fooify(); ' – slashingweapon

+0

Lo adoro! Vorrei non averlo chiamato così ma almeno funziona ... grazie! –

+0

Quale è corretto: 'String.prototype.MyNS(). Fooify()' OR 'String.MyNS(). Fooify()'? La risposta si riferisce al commento di @slashingweapon, ma si riferisce a una sintassi diversa. – jahroy

1

Si aggiunge un nuovo function (class in termini oo) al Stringprototype e non ha accesso al reale String istanza.

Si può solo aggiungere la proprietà direttamente al prototipo:

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