Rendre une méthode privée dans une classe abstraite en JS

POO en Javascript (React)

a marqué ce sujet comme résolu.

Bonjour,

Je me prends la tête depuis plusieurs heures pour faire quelque chose qui est très simple en Java mais que je n’arrive pas à reproduire en JS : Rendre un membre privé dans ma classe mère, pour qu’uniquement le setter de cette même classe puisse le modifier, mais que les classes filles ne puissent pas appeler ce setter).

Voici mon code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
export class AbstractAlgorithm{
  constructor() {
    if (this.constructor === AbstractAlgorithm) {
      throw new Error("Can't instantiate abstract class!");
    }
    var _cash = 100;
    this.setCash = function(cash) {_cash = cash;}
    this.getCash = function() { return _cash; }
  }

  updateValues(order){
    this.setCash(this.getCash()-order.nbTokens*order.value);
  }
}


export class RedAlgorithm extends AbstractAlgorithm{

  constructor() {
    super();
    // empêcher l'appelle à setCash() ici
  }
}

`
+0 -0

Avec du JavaScript c’est tout simplement impossible car le notion de private/public n’existe pas.

Tu peux le simuler avec du TypeScript, mais ce ne sera qu’une coloration du code, une fois transpilé en JS tout sera public à nouveau.

Il faut se dire que la notion d’objet en JS est toute nouvelle, jusqu’à récemment on utilisait surtout des prototypes.

Il faut se dire que la notion d’objet en JS est toute nouvelle, jusqu’à récemment on utilisait surtout des prototypes.

viki53

N’est-ce pas toujours le cas ? Je veux dire, si j’ai bien compris (vhf si tu passes par là…), le mot-clé class est un sucre syntaxique qui évite d’utiliser les prototypes. Mais en interne, il me semble que cela reste encore des prototypes.

Et tu ne voulais pas plutôt dire que c’était justement la notion de classe en JS qui est toute nouvelle ?

Il faut se dire que la notion d’objet en JS est toute nouvelle, jusqu’à récemment on utilisait surtout des prototypes.

viki53

N’est-ce pas toujours le cas ? Je veux dire, si j’ai bien compris (vhf si tu passes par là…), le mot-clé class est un sucre syntaxique qui évite d’utiliser les prototypes. Mais en interne, il me semble que cela reste encore des prototypes.

Et tu ne voulais pas plutôt dire que c’était justement la notion de classe en JS qui est toute nouvelle ?

Ge0

La notion de classe n’est pas nouvelle en JS parce qu’il n’y a pas de classes en JS, en tout cas rien de similaire à ce qu’on appelle classe en Java, C#, C++, Ruby, Python, etc.

La notion d’objet en JS n’est pas nouvelle, c’est un truc central en JS qui est là depuis toujours, comme la notion de fonction par exemple.

Le mot-clé class permet de définir un prototype.

Pour l’OP : il y a des feintes pour simuler ces notions, oui, regarde par exemple ici : https://stackoverflow.com/questions/27849064/how-to-implement-private-method-in-es6-class-with-traceur

+3 -0

Il faut se dire que la notion d’objet en JS est toute nouvelle, jusqu’à récemment on utilisait surtout des prototypes.

viki53

N’est-ce pas toujours le cas ? Je veux dire, si j’ai bien compris (vhf si tu passes par là…), le mot-clé class est un sucre syntaxique qui évite d’utiliser les prototypes. Mais en interne, il me semble que cela reste encore des prototypes.

Ge0

Oui, c’est effectivement un sucre syntaxique, mais pour un débutant inutile de rentrer dans des détails comme ça pour éviter de mélanger les deux (dans la tête comme dans le code).


Pour plus d’infos sur ce que class implique en JS, la spec est assez explicite.

Pour un débutant en JS qui a déjà utilisé un langage objet class-based tel que ceux que j’ai cités (Java, C++, Ruby, Python, Smalltalk, …), il est très important de comprendre qu’en JavaScript class est un concept très différent de celui qu’il connait dans ces langages.

Ce topic en est une preuve à mon avis. L’OP voit que JS a un mot-clé class et présume que c’est comme les classes qu’il connait déjà, et suppose donc que JS a des classes comme celles qu’il connait, et qu’elles vont se comporter environ comme il s’y attend. C’est une très mauvaise idée et l’OP aura de mauvaises surprises.

Pour éviter de mélanger les deux, je recommande aux débutants de ne pas utiliser le mot-clé class avant d’avoir bien compris ce qu’est un prototype, comment fonctionnent les prototypes et leur héritage, et le fait que class définit un prototype.

+2 -0

Mon besoin en gros ce serait que des personnes puissent fournir un bout de code qui serait utilisé par mon appli et qui retourner un résultat. Par contre si les méthodes métiers "critiques" de la classe mères sont accessibles par ces personnes là, niveau sécurité c’est zéro du coup. :(

Je ne connais pas du tout TypeScript ou Babel, est-ce que ça va dans ce sens ?

+0 -0

JS est pas vraiment fait pour ça, en fait, vu que c’est aussi un langage interprété dont les sources sont visibles : tout est ouvert.

TypeScript et Babel permettent d’ajouter ces mots-clés mais c’est de la coloration syntaxique, aucunement un gage de sécurité (ça affichera des avertissements en transpilant, mais ça ne bloquera rien).

Tu peux faire tourner ce code externe dans une sandbox (via une iframe configurée par exemple, en fournissant un SDK commun), pour éviter tout débordement, mais l’incorporer directement à tes sources est dangereux.

Mon besoin en gros ce serait que des personnes puissent fournir un bout de code qui serait utilisé par mon appli et qui retourner un résultat. Par contre si les méthodes métiers "critiques" de la classe mères sont accessibles par ces personnes là, niveau sécurité c’est zéro du coup. :(

RedTheTweet

Peux-tu donner un exemple plus précis de ce que tu veux faire ?

Je comprends pas en quoi ça pose un problème de sécurité. (Comprendre : si ton code tourne dans un navigateur, tout y est modifiable et tu ne peux strictement rien faire la-contre.)

+0 -0

Mon besoin en gros ce serait que des personnes puissent fournir un bout de code qui serait utilisé par mon appli et qui retourner un résultat. Par contre si les méthodes métiers "critiques" de la classe mères sont accessibles par ces personnes là, niveau sécurité c’est zéro du coup. :(

RedTheTweet

Peux-tu donner un exemple plus précis de ce que tu veux faire ?

Je comprends pas en quoi ça pose un problème de sécurité. (Comprendre : si ton code tourne dans un navigateur, tout y est modifiable et tu ne peux strictement rien faire la-contre.)

victor

En fait je voudrais proposer une sorte de template, que des utilisateurs pourraient compléter avec leur propre code afin d’obtenir des résultats… Si jamais tu connais le site codingame.com , c’est un peu le principe de leurs mini-jeux.

Je connais pas codingam. Mais est-ce que tu es d’accord que peu importe que ton AbstractAlgorithm ait des méthodes ou attributs privés ou pas, du moment que c’est dans ton navigateur ce sera 100% modifiable ?

Si tu veux que quoi que ce soit puisse être réellement privé, sécurisé, pas modifiable par un visiteur, il faut que ce soit côté serveur.

+2 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte