Je suis un navigateur de longue date, mais c'est la première fois que je participe. Si j'oublie un détail de l'étiquette, faites-le moi savoir !
De plus, j'ai cherché partout, y compris sur ce site, mais je n'ai pas trouvé d'explication claire et succincte de ce que je cherche à faire exactement. Si je l'ai raté, indiquez-moi la bonne direction !
D'accord, je veux étendre certains objets JavaScript natifs, tels que Array et String. Cependant, je ne veux pas vraiment les étendre, mais créer de nouveaux objets qui héritent d'eux, puis les modifier.
Pour Array, ça marche :
var myArray = function (n){
this.push(n);
this.a = function (){
alert(this[0]);
};
}
myArray.prototype = Array.prototype;
var x = new myArray("foo");
x.a();
Cependant, pour String, la même chose ne fonctionne pas :
var myString = function (n){
this = n;
this.a = function (){
alert(this);
};
}
myString.prototype = String.prototype;
var x = new myString("foo");
x.a();
J'ai aussi essayé :
myString.prototype = new String();
En faisant des recherches sur le sujet, j'ai découvert que ça marche :
var myString = function (n){
var s = new String(n);
s.a = function (){
alert(this);
};
return s;
}
var x = myString("foo");
x.a();
Cependant, j'ai presque l'impression de "tricher". Comme, je debe utiliser le "vrai" modèle d'héritage, et non ce raccourci.
Donc, mes questions :
1) Pouvez-vous me dire ce que je fais de mal en ce qui concerne l'héritage de String ? (De préférence avec un exemple fonctionnel...)
2) Entre l'exemple de l'héritage "réel" et l'exemple du "raccourci", pouvez-vous citer des avantages ou des inconvénients évidents d'une méthode plutôt que de l'autre ? Ou peut-être simplement des différences dans la façon dont l'une fonctionnerait par rapport à l'autre d'un point de vue fonctionnel (parce qu'en fin de compte, elles me paraissent identiques...).
Merci à tous !
EDITAR:
Merci à tous ceux qui ont commenté/répondu. Je pense que les informations de @CMS sont les meilleures car :
1) Il a répondu à mon problème d'héritage des chaînes en indiquant qu'en redéfinissant partiellement une chaîne dans mon propre objet chaîne, je pouvais le faire fonctionner. (par exemple, en surchargeant toString et toValue). 2) La création d'un nouvel objet qui hérite de Array a ses propres limites qui n'étaient pas immédiatement visibles et qui ne peuvent pas être contournées, même en redéfinissant partiellement Array.
À partir de ces deux éléments, je conclus que la revendication d'héritabilité de JavaScript ne s'étend qu'aux objets que vous créez vous-même, et que lorsqu'il s'agit d'objets natifs, tout le modèle s'effondre. (C'est probablement pourquoi 90% des exemples que vous trouvez sont Pet->Dog ou Human->Student, et non String->SuperString). Ce qui pourrait être expliqué par la réponse de @chjj selon laquelle ces objets sont vraiment destinés à être des valeurs primitives, même si tout en JS semble être un objet, et devraient donc être héritables à 100%.
Si cette conclusion est totalement erronée, veuillez me corriger. Et si elle est exacte, alors je suis sûr que ce n'est une nouvelle pour personne d'autre que moi - mais merci encore à tous pour vos commentaires. Je suppose que j'ai maintenant un choix à faire :
Soit aller de l'avant avec l'héritage parasite (mon deuxième exemple dont je connais maintenant le nom) et essayer de réduire son impact sur l'utilisation de la mémoire si possible, ou faire quelque chose comme @davin, @Jeff ou @chjj ont suggéré et soit psudo-redefine ou redéfinir totalement ces objets pour moi-même (ce qui semble un gaspillage).
@CMS - compilez vos informations dans une réponse et je la choisirai.