2010-05-09 3 views
3

Essayer de saisir Prototypage dans Javascript. Essayer de créer mon propre espace de noms pour étendre l'objet String en JavaScript.prototype JavaScript (ing) question

Voici ce que j'ai jusqu'à présent (un extrait):

var ns { 
alert: function() { 
    alert (this); 
} 
} 
String.prototype.$ns = ns; 

Comme vous pouvez le voir, je suis en train de placer ce qui sera une série de fonctions dans l'espace de noms ns. Je peux donc exécuter une commande comme ceci:

"hello world".$ns.alert(); 

Mais le problème est, le ce ne fait pas référence le texte envoyé (dans ce cas, « Bonjour tout le monde »). Ce que je reçois est un message d'alerte à ce qui suit:

[object Object]

Ne pas avoir une compréhension complète de la nature orientée objet de JavaScript, je suis à une perte, mais je suppose que je Il me manque quelque chose de simple.

Est-ce que quelqu'un sait comment atteindre ce (obtenir le texte source de l'objet imbriqué)? Bref, il me reste à faire de la programmation procédurale (ns.alert ("bonjour monde");) que j'essaie d'éviter.

Merci -

Répondre

5

Ce qui se passe parce que quand vous invoquez une référence, son objet de base est défini comme la valeur this de la méthode invoquée (plus de détails techniques here).

Ainsi, lorsque vous invoquez "hello world".$ns.alert(); la valeur this dans votre méthode alert, se référera à "hello world".$ns, qui est String.prototype.$ns.

Je ne pense pas que l'ajout de niveaux d'objet (espaces de noms) à l'intérieur du prototype des objets intégrés peut être utile, je recommande généralement à not modify objects you don't own.

+0

Je pense que ce serait utile (pour moi, de toute façon). Y at-il un moyen de faire ce que je suis en train de faire (peut-être quelque chose comme this.parent ou this.caller ou quelque chose comme ça?) Merci - – OneNerd

+0

@OneNerd, bien être '$ ns' un objet, il n'y a aucun moyen pour savoir d'où vient la référence précédente, une solution (si * vous en avez vraiment besoin), serait de faire de '$ ns' une fonction pour préserver le contexte où elle a été appelée (la chaîne) et renvoyer un objet contenant les méthodes (quelque chose comme [this] (http://jsbin.com/iwiku/edit)), mais * je ne l'aime pas vraiment *, IMO il n'y a rien de mieux que d'appeler 'ns.alert (" Hello World ") ; ', Je ne suis pas sûr pourquoi vous essayez d'éviter l'approche plus discrète/simple. – CMS

+0

Eh bien, votre solution fonctionne définitivement, bien que je ne me soucie pas de devoir faire le "bonjour" .ns(). Alert(); (le() après ns). Peut-être que je devrais aller à ta place à la place. Mon but était d'ajouter quelques fonctions utilitaires aux objets et d'éviter toute collision de noms (en plaçant mon contenu dans un espace de noms). Je suppose que je vais devoir décider si votre manière proposée (qui semble être la seule manière) va être une bonne idée (semble que vous ne le pensez pas, donc je vais devoir le rouler dans ma tête). Merci cependant - marquera le vôtre comme réponse acceptée. – OneNerd