10
votes

Est-il possible de faire une fonction javascript agir comme si c'était une chaîne, non ()

est-ce possible ou je suis en train d'aboyer le mauvais arbre ici? XXX

MISE À JOUR:

L'objet que FNC est censé représenter est en fait un document Sarissa Dom. Voici une version plus élaborée de la FNC (), DOM_DOC (). La réponse acceptée ci-dessous a été intégrée à la fonction ci-dessous. xxx

Démo: jsfiddle


16 commentaires

Oui c'est possible. C'est ce qu'on appelle getter s.


Pas le meilleur Dupe, mais j'ai trouvé JavaScript Getters et Setters pour Dummies?


@Bergi Yep, merci, je n'étais pas au courant des getters


@Bergi DO DuPes est supprimé? Si oui, idk si c'est une bonne idée, sans connaître le mot "getter" j'ai passé beaucoup trop de temps à googler sans beaucoup de chance.


@ Serhiy habituellement, les questions fermées comme des doublons sont conservées comme des panneaux de signalisation pour les personnes qui leur arrivent via Google.


@Jari Je travaille avec une application Legacy, XML Datas Islands et Sarissa. J'ai mis en place comme un échantillon rapide afin de ne pas entrer ... Doc.xml = Nouveau XMLSerializer (). Serializetostring (Doc);


@bfavaretto Je ne suis pas sûr que cela reste un duplicata de getters. La solution non getter a le mieux travaillé pour moi.


@ Serhiy Il n'y a rien dans le code de la notionnaire Jsfiddle mentionnant dom_doc () ou fnc . En outre, veuillez publier le code ici afin que le contexte soit plus clair. Où est le code qui utilise le résultat de get_doc ()?


@Serhiy j'ai le sentiment que la suggestion de Bfavaretoo n'a pas fonctionné car vous utilisez IE8? Dans IE 8, vous ne pouvez ajouter que des getters à Dom Nœches kangax.github.io/ es5-compat-table / # objet.defineProperty


@JuanMendes non en réalité chrome v26, pour IE, j'utilise simplement ActiveXObject ("msxml2.domdocument.3.0"), mettez également à jour la question de JS Fiddle Stuff


@Serhiy maintenant que je vois votre code actuel, pourquoi pas seulement doc.xml = nouveau xmlSerializer (). Serializetostring (doc); ?


@bfavaretto Le XML est manipulé via Setattribute et tel. C'est ce que j'ai essayé d'abord et remarqué que les modifications ne sont pas reflétées, seule la chaîne XML d'origine est renvoyée.


@Serhiy pouvez-vous publier le code qui appelle get_doc (nom_node) ? Je ne comprends toujours pas pourquoi vous ne pouvez pas utiliser getters


@Jouanmendes Qu'est-ce que je me soucie d'avoir ma réponse ... haha ​​j / k, voici le violon pour illustrer ce qui se passe. Je ne pouvais pas obtenir getters ni prototype de travailler dans ce contexte jsfiddle.net/sh6du/1


@BFavaretto J'ai fait un exemple de mon dernier commentaire à vous dans ce violon, juste note de ligne 23 jsfiddle.net/sh6du / 1


@Serhiy je l'ai eu, merci de clarifier.


3 Réponses :


9
votes

Vous semblez parler de la méthode getter . Si c'est ce que vous voulez dire, vous pouvez utiliser ceci: xxx

http: // jsfiddle .NET / ZZTYD / 1

Ceci n'est pas compatible avec les navigateurs plus anciens (voir la table de compatibilité au bas de Cette page ).

En outre, il est un peu bizarre d'utiliser un getter pour aller chercher une variable globale. Habituellement, vous utilisez cela pour obtenir la valeur d'une variable privée sur votre objet d'instance et, dans ce cas, vous ne pouvez la modifier que par un seigter correspondant.


13 commentaires

Vous ne voulez pas que votre defineProperty appelle dans le constructeur?


Pourquoi ne pas mettre la définition de la propriété à l'intérieur le constructeur, tout comme l'op l'avait?


@Serhiy Il y a aussi la syntaxe littérale fnc.prototype = {get x () fonction () {renvoie données}}}} jsfiddle.net/mendesjuan/zztyd/2


@Juanmendes mais qui est non standard, n'est-ce pas?


Un getter est-il le seul moyen de mettre en œuvre cela?


@Travisj Si vous ne voulez pas que les parenthèses appelantes, oui.


@bfavaretto développeur.mozilla.org/en-us/docs/ JavaScript / Référence / Operat ORS / ... dit qu'il est dans Ecmascript5 et pris en charge par IE9 + / Firefox1.8.1 + / chrome / Opera9.5 + / Safari3 +


NIT: Les getters permettent à une propriété qui évalue à une fonction - mais pas pour une fonction générale - à être "invoquée sans ()"


@JuanMendes - Il n'y a rien de mal par exemple, bien que certaines personnes doivent soutenir IE8 +, afin que ce soit la principale raison que j'ai posée.


@ JuanMendes Getters et Setters font partie de ES5, mais Obtenez comme opérateur est une chose mozilla (ce n'est pas dans la spécification ES5, ou du moins je ne pouvais pas le trouver).


@ user2246674 Vous avez toujours besoin d'IE9 d'utiliser objet.defineProperty donc c'est le même problème.


@BFavaretto Regardez à la page 65 ECMA-International.org/ Publications / fichiers / ECMA-ST / ECMA-262.P DF


@Juanmendes ah, merci! Ce n'est donc pas un opérateur en tant que MDN des États.



4
votes

L'alternative à La solution de BFAVARETTO's -> consiste à utiliser la syntaxe littérale pour un objet. A presque le même niveau de support que objet.defineproperty () code>.

aussi, vous devez appeler objet.defineproperty code> une seule fois, pas avec chaque instanciation. P >

Je vais aussi fournir un exemple plus réaliste, c'est-à-dire que la propriété est calculée, au lieu de simplement référencer un global. p>

http://jsfiddle.net/mendesjuan/zztyd/3/ p> xxx pré>

de ceci est que vous pouvez modifier la mise en œuvre pour être stockée au lieu de calcul et vous n'aurez pas à changer comment on l'appelle. p> xxx pré>

avis que vous devez maintenant appeler SETA code> de sorte que la somme peut être recalculée. Ou vous pouvez utiliser un setter. P>

function Pair(a,b){
    this.a = a;
    this.b = b;
    this.sum = a + b;
}

Pair.prototype = {
    set a(a) {
        this.a  = a;
        this.sum = this.a + this.b; 
    }
};

var pair = new Pair(1,2);
alert(pair.sum);
pair.a = 5;
alert(pair.sum);


2 commentaires

+1 Pour un exemple en fait utile d'un getter - et pour ce commentaire avec le numéro de page sur la spécification ECMA :) Une seule chose: cette syntaxe est clairement plus simple, mais objet.defineProperty ne doit pas nécessairement être appelée à chaque instanciation ; Il pourrait être utilisé sur le prototype du constructeur comme vous l'avez fait ici.


@bfavaretto corrigé le texte afin qu'il n'implique pas que objet.defineproperty ne doit pas nécessairement être appelé avec chaque instanciation



3
votes

jsfiddle démo code> em>

Ces types de solution de contournement contournent cependant. Il ne devrait pas s'agir d'une grande partie d'un panier d'utiliser simplement () code> sur vos fonctions. Utiliser () code> est attendu, lisible, la meilleure pratique et la norme de l'industrie. P>

Je ne sais pas pourquoi SmartCaveman CODE> a décidé de supprimer sa réponse d'utiliser Tostring code> mais c'est une approche viable bien que quelque peu pirate. p>

var data = 'one';
function fnc(){
 var getData = {};
 getData.toString = function(){
   return data;
 };
 this.out = getData;
}

var instance = new fnc();

alert(instance.out);//one
data = 'two';
alert(instance.out);//two

var s = instance.out;
alert(s);//two


10 commentaires

J'espère que ce n'était pas de ma faute d'aller non plus si sa solution n'a pas fonctionné. C'est cependant exactement ce dont j'ai besoin et modifié la réponse à celle-ci, car les deux autres méthodes ne fonctionnent pas bien dans le contexte de la situation réelle.


La réponse de SmartCaveman ne fonctionne que si ce que vous utilisez appelle automatiquement Tostring () pour vous, comme alerte . Ce n'est pas ce que la puissance demande


Je suis en désaccord que la norme utilise une méthode. JavaScript a toujours eu la propriété getter / setters, ce n'est que nous (JS Developers) ne pouvaient pas créer la nôtre. L'exemple le plus simple est un setter comme document.cookie = "..." , il ne peut pas simplement définir une propriété, il appelle une méthode sous la hotte.


OP ici, voici le contexte dans lequel il s'agit de la seule réponse qui a fonctionné et de la raison pour laquelle j'ai accepté cette réponse sur les autres, au cas où n'importe qui est intéressé. jsfiddle.net/kqfp5


@Serhiy Vous êtes peut-être le PO, mais ce n'est pas la réponse à la question que vous avez posée, c'est la solution de contournement du problème que vous rencontrez, deux choses différentes. Cette question devrait être utile pour tout le monde, pas seulement le problème que vous essayiez de résoudre. C'est l'esprit de débordement de pile. Il n'est pas non plus clair que votre jsfiddle prouve


@JuanMendes C'est la réponse avec le code qui ressemble le plus à la langue dans le titre de la question. C'est aussi celui qui a travaillé pour mon cas d'utilisation. Ce peut être un travail autour, mais cela fait exactement ce que je pensais avoir demandé. Je n'ai pas demandé une leçon de getter ou de prototype ... Je sais que je suis un mannequin ...: P


@Serhiy, je vous explique simplement que l'esprit de sorte de ne pas résoudre votre problème spécifiquement, mais pour répondre à la question d'une manière qui est utile aux autres. Maintenant, d'autres peuvent penser que c'est la bonne solution, mais ce n'est que juste pour votre cas


@JuanMendes - Je crois que vous êtes déformé sur le "Esprit" lorsque vous faites ces déclarations. Veuillez lire ce message sur Meta: meta.stackexchange.com/a/5235/178816 et faire un message sur Meta En ce qui concerne votre problème sur «l'esprit de SO» avant de prendre le manteau complet de ce que Stackoverflow est ou non ou commencez à dicter ce que l'OP devrait ou ne devrait pas accepter. Notez la partie qui dit: "L'essentiel est que vous devez accepter la réponse que vous avez trouvée la plus utile pour vous, personnellement."


@JuanMendes Bon appel, je modifierai la question pour fournir le contexte aussi. Je viens de comprendre l'ébullition du problème le permet de digérer plus facilement. J'ai peut-être trop bouilli.


@Travisj Serhiy a compris ce que je voulais dire: la question et la réponse sont déséquilibrées, la résolution de la question est la bonne chose à faire. Du même post "Assurez-vous que, en plus de travailler pour vous, la réponse est vraiment bonne pratique. Parfois, après que la réponse soit acceptée, une autre appartient, découvrant le fait que l'une précédente était en fait un mauvais piratage." Ce n'est pas un mauvais piratage, mais c'est toujours une solution de contournement. Sans contexte de l'OP, on ne sait pas pourquoi ils ne peuvent pas simplement utiliser des getters