73 votes

Ajouter une méthode à la classe string

J'aimerais pouvoir dire quelque chose comme ceci en javascript :

   "a".distance("b")

Comment puis-je ajouter ma propre fonction de distance à la classe string ?

0 votes

Comment ça s'appelle quand quelqu'un fait ça. Est-ce que c'est considéré comme un singe Parcheando ou autre chose puisque vous ajoutez seulement une nouvelle méthode ?

0 votes

@still_dreaming_1 C'est ce qu'on appelle l'extension : stackoverflow.com/questions/3781373/

143voto

Matt Points 38395

Vous pouvez étendre le String prototype ;

String.prototype.distance = function (char) {
    var index = this.indexOf(char);

    if (index === -1) {
        alert(char + " does not appear in " + this);
    } else {
        alert(char + " is " + (this.length - index) + " characters from the end of the string!");
    }
};

... et l'utiliser comme ceci ;

"Hello".distance("H");

Voir un JSFiddle ici .

40 votes

Pour info utilisez this pour obtenir la chaîne de caractères sur laquelle cette fonction est appelée

5 votes

En fait, pour moi, this renvoie un objet comme String {0: "t", 1: "e", 2: "s", 3: "t", length: 4, [[PrimitiveValue]]: "test"} . Pour travailler avec le texte actuel, j'ai dû appeler this.toString()

1 votes

Y a-t-il un moyen d'écrire "String.prototype.distance = function (char) {}" en ECMA script ?

21voto

William Points 7664
String.prototype.distance = function( arg ) {
    // code
};

14voto

J.M.I. MADISON Points 857

Minimal exemple :

Aucun n'a été mentionné valeurOf .

\==================================================

String.prototype.
OPERATES_ON_COPY_OF_STRING = function ( 
    ARGUMENT 
){

    //:Get primitive copy of string:
    var str = this.valueOf();

    //:Append Characters To End:
    str = str + ARGUMENT;

    //:Return modified copy:
    return( str );
};

var a = "[Whatever]";
var b = a.OPERATES_ON_COPY_OF_STRING("[Hi]");
console.log( a ); //: [Whatever]
console.log( b ); //: [Whatever][Hi]

\==================================================

D'après mes recherches, il n'y a aucun moyen de modifier la chaîne en place.

Même si vous utilisez un objet de type chaîne au lieu d'une primitive de type chaîne.

En dessous de ne fonctionne pas et obtient des résultats vraiment bizarres dans le débogueur.

\==================================================

String.prototype.
EDIT_IN_PLACE_DOES_NOT_WORK = function ( 
    ARGUMENT 
){

    //:Get string object:
    var str = this;

    //:Append Characters To End:
    var LN = str.length;
    for( var i = 0; i < ARGUMENT.length; i++){
        str[LN+i] = ARGUMENT[ i ];
    };

};

var c = new String( "[Hello]" );
console.log( c );
c.EDIT_IN_PLACE_DOES_NOT_WORK("[World]");
console.log( c );

\==================================================

9voto

iiic Points 318

Après des années (et ES6) nous avons une nouvelle option pour faire cela :

Object.defineProperty( String.prototype, 'distance', {
    value: function ( param )
    {
        // your code …
        return 'counting distance between ' + this + ' and ' + param;
    }
} );

// ... and use it like this:
const result = "a".distance( "b" );
console.log(result);

8voto

JAiro Points 2587

Tu pourrais faire ça :

String.prototype.distance = function (){ 
    //your code 
}

2 votes

C'est une erreur de syntaxe (vous avez commenté votre accolade de fermeture) :D

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X