0
votes

Comment utiliser une instance de classe comme une propriété statique?

Je veux créer une propriété statique pour une classe nommée OUTERCLASS. Je veux que la valeur de cette propriété soit une instance d'une autre classe, nommée innerclass code>.

Voici la classe intérieure. Il a une propriété et une fonction. P> xxx pré>

et voici la classe externe, qui n'a qu'une seule propriété statique. P>

// myScript.gs

function myScript() {

  console.log(OuterClass.innerClass.myProperty);   // 42.0
  console.log(OuterClass.innerClass.myFunction()); // TypeError: Cannot find function myFunction in object [object Object].

  var anotherInnerClassInstance = new InnerClass();
  console.log(anotherInnerClassInstance.myFunction()); // 43.0
}


12 commentaires

Puis-je vous poser une question sur la méthode de réplication de votre numéro de TypeError: impossible de trouver la fonction MyFunction dans l'objet [Objet Objet] AT OUTERCLASS.INNERCLASS.MYFUNCTION () ? Parce que lorsque myscript () est exécuté une fois que votre script a été copié et collé à l'éditeur de script, aucune erreur ne se produit. Et le journal affiche 42 , 43 et 43 .


Votre exemple fonctionne à Chrome pour moi, c'est que Google Apps scripts n'est pas construit sur V8?


Lorsque vous savez que le hisser est le problème, pourquoi ne pas tout garder dans l'ordre comme vous êtes collé ici?


MyFunction est la fonction prototype. Alors l'ordre n'a pas d'importance. Sa partie de __ proto __ et qui est partagée dans toute l'instance. Il sera donc attaché à tous les insaces de votre class intérieure. Votre exemple fonctionne bien dans n'importe quel ordre


Pouvez-vous s'il vous plaît décrire votre structure de fichiers? Je copie / collé votre code, modifié Console.log vers Logger.log, le faisait sans aucun problème et reçu la sortie attendue.


@Tanaike et Daniel Lizik Depuis ce code correspondent au script Google Apps, je finirai éventuellement à exposer des fonctions à utiliser dans des feuilles de calcul. Ces fonctions utiliseront ces classes. Pour les tests de base, les fonctions de la classe peuvent être exécutées manuellement dans l'éditeur de script (j'utilise les fiches Google, en particulier.)


@Az_ Bonne pratique dicte que les classes devraient être dans leurs propres fichiers.


@Tall car cela peut être un problème spécifique au script Google Apps, je changerai "JavaScript" dans mon poste de poste sur "Script Google Apps".


@DieGo dans ma structure de fichiers actuelle, chaque morceau de code indiqué est un fichier GS distinct. Je vais clarifier cela dans mon post.


@Cameronhudson Je l'ai séparé dans 3 fichiers: inner.gs, externe.gs et code.g Je ne peux toujours pas reproduire votre problème. Si vous créez un nouveau projet avec juste ce code, obtenez-vous le même résultat?


Est-ce que cela répond à votre question? Quelle édition de ECMA-262 est-elle prise en charge Google Apps Script?


@Daniellizik Nope. J'ai ajouté à mon message un lien vers la feuille Google produisant l'erreur.


3 Réponses :


0
votes

Comme d'autres ont mentionné dans la question de la question, votre code fonctionne bien pour moi être un script unique ou trois fichiers différents. La seule chose que j'ai faite (comme Diego a déjà dit) change pour LOGGER .

sur l'exécution de la fonction myscript () i Obtenez les journaux suivants dans les applications d'applications (comme prévu):

[19-12-05 01: 23: 28: 198 PST] 42.0

[19-12-05 01: 23: 28: 199 PST] 43.0

[19-12-05 01: 23: 28: 199 PST] 43.0

Aussi si vous souhaitez toujours coder dans pure javascript ou dactylographie et ultérieurement sur script d'applications Je suggérerais d'utiliser Fermoir .


1 commentaires

J'ai ajouté à mon message un lien vers la feuille Google produisant l'erreur. Je suis surpris que d'autres ne puissent pas répliquer l'erreur. Cela pourrait être un indice sur la cause de la racine.



1
votes

La solution de contournement que j'ai fini par utiliser était d'utiliser un getter to paresseux-initialiser l'instance de classe de propriété statique. C'est un peu plus verbeux, mais de cette façon, la levage n'est pas un problème. XXX


0 commentaires

1
votes

ordre d'analyse

Bien que je ne connaisse pas exactement comment les fichiers de script ont été analysés en interne dans Rhino Runtime (et que votre projet suggère que vous l'avez utilisé, et non le NEWER V8), dans le Guide de migration, il est mentionné que l'ordre des fichiers N'importe pas dans Rhino , alors supposons que le codebase est concaténé dans un gros morceau avant d'être analysé.

Il semble que le processus soit quelque peu dépendant de l'ordre de création de fichiers . J'ai réussi à reproduire systématiquement votre problème dans Rhino en inspectant l'ordre des appels en utilisant des fermetures simples, jetez un coup d'œil: xxx

comme prévu, l'ordre des appels dans le journal est aussi suit lorsque vous exécutez testcp :

journaux d'appels Hof

maintenant, si vous Allumez le code dans les fichiers, les journaux ont l'air différent (ce qui vous permet de rechercher ce que vous vouliez):

 journaux d'appels avec des fichiers échangés

alternative Solution

Celui que vous avez fourni avec une chargement paresseux (motif singleton) devrait suffire. Je ne suggérerais que d'utiliser l'inversion de dépendance pour vous donner plus de flexibilité et de rendant innerclass une dépendance rigoureuse: xxx

Cette fois, tout fonctionne comme prévu dans n'importe quelle direction :

 enregistre avec di


0 commentaires