IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

L'opérateur new, bonne ou mauvaise pratique ? [Tutoriel]


Sujet :

JavaScript

  1. #21
    Membre éclairé

    Femme Profil pro
    Experte JS / Conseillère en best practices / Chercheuse en programmation
    Inscrit en
    Octobre 2007
    Messages
    741
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Experte JS / Conseillère en best practices / Chercheuse en programmation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 741
    Points : 808
    Points
    808
    Par défaut
    J'avais bien compris, c'est juste que j'y relève un mauvais point, tout de même, (j'sens qu'on va encore me traiter d'intégriste ) :
    il pourrit, lui aussi, la propriété "constructor", en le définissant en itérable.

    De plus, ma version renverra une erreur, ce qui me semble plus proche du comportement interpréteur, si on a spécifié autre chose qu'une fonction, en guise d'"initializer".

    Enfin, chacun a ses avantages et inconvénients...

    Le sien :

    • son prototype nécessite obligatoirement une fonction
    • il préserve donc le nom du constructeur
    • pour étendre son prototype, il faut étendre le prototype de la fonction "extend", différent de celle créant les instances, ce qui me semble très déroutant à la relecture du code


    Le mien :

    • ne nécessite pas de fonction
    • il ne préserve donc pas le nom du constructeur, ce qui peut être déroutant au debugging
    • on étend le prototype de la fonction servant à créer une instance
    Afin d'obtenir plus facilement de l'aide, n'hésitez pas à poster votre code de carte bancaire

    Mon GitHub

    Une alternative à jQuery, Angular, Vue.js, React, ... ? Testez anticore, en quelques secondes à peine !
    (Contributions bienvenues)

  2. #22
    Membre émérite
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Points : 2 778
    Points
    2 778
    Par défaut
    A lire sur le sujet, un article super intéressant : new Fn(...) vs. Object.create(P) (orienté V8)
    En gros : V8 est mieux optimisé pour gérer le pattern new Fn que Object.create

  3. #23
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    C'est quand même dommage de réduire ça à une question de performance, d'autant plus que l'article propose des pistes d'améliorations pour V8.
    One Web to rule them all

  4. #24
    Membre émérite
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Points : 2 778
    Points
    2 778
    Par défaut
    C'est clair. Le gain est quasi nul. Il commence à être visible si tu crées des milliers de milliers d'objet. C'est pas du tout significatif

  5. #25
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Je profite que le topic soit up pour faire un feedback sur ma migration de new à Object.create : j'ai dû faire marche arrière à cause de l'impact sur le debugging.

    En effet, les fonctions en JavaScript peuvent connaître leur propre nom:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function Toto(){  console.log("My name is " + arguments.callee.name);
    }
     
     
    Toto() // My name is Toto
    Ce que ne permettent pas les objets ; de ce fait, quand on logge ou inspecte des objets leur nom n'apparaît pas clairement. On peut toujours les comparer si on dispose d'une référence au prototype, mais ça reste un gros frein au debugging.

    Seules les fonctions peuvent connaitre leur propre nom. Le seul moyen que j'ai trouvé pour essayer de se rapprocher de cette fonctionnalité avec les objets, c'est de renommer manuellement une fonction anonyme par un wrapper et un eval, puis de passer par un proxy ES6 pour rediriger les propriétés et méthodes sur le véritable objet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function name(name, extend) {
        var obj = Object.create(extend && extend.prototype);  
        var wrapper = (new Function("return function (call) { return function " + name +
            " () { return this; }; };")())(Function.apply.bind(obj));    
      return new Proxy(wrapper, { get: function(target, name){ return obj[name]; } });
    }
     
     
    var Car = name("Car", Object);
    var golf = name("Golf", Car);
    Oui je sais, ça fait peur et ça ne vaut rien. J'en suis arrivé à la conclusion qu'on arriverait à rien tant que les inspecteurs de développement ne permettraient pas un source-mapping entre le nom et la valeur des variables, ce qui n'est pas demain la veille. On pourrait aussi dire que JavaScript est fondamentalement mal conçu sur ce point, mais je ne pense pas que Brendan Eich avait deviné il y a 20 ans à quoi allaient ressembler les inspecteurs JavaScript actuels.
    One Web to rule them all

  6. #26
    Membre émérite
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Points : 2 778
    Points
    2 778
    Par défaut
    Oui je sais, ça fait peur


    Quand tu es en mode debug, par exemple sur Chrome (en plaçant debugger quelque part), tu peux voir le nom de la variable et ce qu'elle contient à cet instant, non ? Ou alors j'ai mal compris ton besoin

  7. #27
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Tu vois le contenu de la variable, mais pas le nom donné à son proto, contrairement à new où le debugger affiche le constructor.name, donc dans le cas présent ça loggerait "Car { model: ... }". Une autre option est de laisser une propriété name:"Car", mais bon ça reste pas l'idéal du tout. Il faut aussi surcharger toString dans ce cas.
    One Web to rule them all

  8. #28
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Référence : http://jsperf.com/performance-oovsoloo/4

    Question performance, il faut oublier Object.create() et Object.freeze().

    Firefox est encore plus lent que Chrome.

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  9. #29
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Test 5 : http://jsperf.com/performance-oovsoloo/5

    J'en conclus que "new" est vraiment incontournable si la vitesse d'exécution est importante.

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  10. #30
    Membre averti
    Profil pro
    à la bougie alors
    Inscrit en
    Mai 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : à la bougie alors

    Informations forums :
    Inscription : Mai 2006
    Messages : 224
    Points : 362
    Points
    362
    Par défaut new, Object.create et D. Crockford
    -- new

    Si on lit la spécification ES3, on s'aperçoit :
    - que toutes les fonctions peuvent se comporter comme des constructeurs. Elles ont, associé, un prototype qui permet par exemple l'appel new ({}.toString)() que cela ait un sens ou non.
    - qu'il y a une distinction sémantique entre appel comme constructeur et appel comme fonction, justement avec l'opérateur 'new'.
    - qu'enfin, la spécification distingue explicitement ces différentes formes d'appel dans le cas des objets 'builtin' :
    Constructeurs appelés comme fonction :
    - Conversion de type : { Object, String, Boolean, Number }
    - Appel comme constructeur : { Function, Array, Error }
    - Autres :
    -- Date([...]) <=> (new Date()).toString()
    -- RegExp(<RegExp>) <=> <RegExp>, et RegExp(...) <=> new Regexp(...)

    Je n'arrive (vraiment) pas à comprendre, le problème avec 'new'. Je comprends bien que, si la fonction est écrite comme un constructeur, c'est à dire utilisant 'this' pour modifier l'objet, cela pose un problème si on oublie le 'new'. Mais :
    1- c'est une erreur de programmation assez grossière, de débutant, un peu comme d'oublier un '=' dans un test d'égalité (peu de chance qu'un dev Java oublie 'new' !)
    2- pourquoi avoir lié 'this' au contexte global hors de l'utilisation de 'new' ou d'un appel 'object.method()' où 'this' se comporte comme on peut l'attendre ?

    Si vraiment c'est un gros problème, pourquoi diminuer la sémantique du langage en évitant 'new' ? Pourquoi au contraire ne pas en profiter pour proposer des constructeurs multi-fonctionnels ? ou à minima, gérer le problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function Foo ( bar ) {
      if ( !(this instanceof Foo) )
        return new Foo(bar);
      this.bar = bar;
    }
    Comme ça, on vérouille le cas : var foo = Foo(...);, et on se retrouve dans le même cas que 'Function', 'Array', etc. Voire pour les plus angoissés une fonction encapsulant le constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function Constructor ( Construct ) {
      return (function Ctor (/*arguments*/){
        if ( !(this instanceof Ctor) )
          return Ctor.apply(
              Object.create(Ctor.prototype),
              arguments );
        return Construct.apply(this, arguments);
      });
    }
    var Foo = Constructor(function( bar ) {
      this.bar = bar;
    )};
    // Foo(..) <=> new Foo(...)
    On peut remarquer au passage qu'on traduit l'appel de fonction vers l'appel comme constructeur et que donc il vaut mieux utiliser 'new' : on évite ainsi un appel de fonction supplémentaire.

    -- Object.create

    C'est subjectif, mais je trouve le modèle d'héritage mis en place en Javascript assez élégant. La récursivité entre 'Object', 'Function' et leurs protoypes me rappelle (un peu) ObjVLisp.
    En tout cas, on avait (pré ES5) un graphe d'héritage cohérent avec 'Object.prototype' comme racine (hors types primaires et objets externes).

    ES5: introduction de 'Object.create' ... que permet cette fonction qu'on ne pouvait pas faire avant ? presque rien (je ne parle pas de 'Object.defineProperty') sauf ...
    casser le graphe d'héritage. On peut créer des objets 'Object.create(null)', qui ne sont pas des types primaires, pas des objets externes mais qui se retrouvent hors du graphe d'héritage.
    Sur le fond, pourquoi pas. Mais c'est quand même une rupture de taille. Avant d'appeler n'importe quelle methode de 'Object.prototype', il va falloir trouver un moyen de savoir si l'objet hérite ou pas de 'Object.prototype'. Quand on voit les acrobaties de code, ne serait-ce que pour savoir si un objet est un tableau ...
    Si au moins on avait eu typeof object == "what do you mean exactly by 'typeof' ?".

    Le coté positif, c'est que cela étend les capacités du langage.

    -- D. Crockford

    Sa fonction si je la comprends est une tentative à destination de (qui?) pour fournir un modèle de "classe" simplifié :

    - possibilité d'hériter d'un constructeur (extend.prototype)
    - séparation des attributs (initializer) et des méthodes (méthods)
    - graphe d'héritage rendu statique au niveau des constructeurs (cloture du prototype)

    C'est une approche. Je ne vois pas ce qu'elle apporte à part augmenter la confusion en créant des représentations qui ne sont pas celle du langage.
    S'il avait conservé le 'new' cela aurait donné de la cohérence puisque qu'en général dans les langages de classe, 'new' est utilisé. Là au contraire, si on utilise 'new' on va forcer le langage a créer un objet, établir le lien d'héritage et tout mettre à la poubelle, puisque qu'on le snobe en refaisant le processus de l'autre coté ... Mais impossible de conserver 'new' puisque que justement, pour avoir un graphe d'héritage statique, le prototype est dans la cloture et que l'utilisation de 'new' risquerait de casser ce graphe d'héritage. Autrement dit, pour gérer une vision plus commune des langages de classes, il introduit lui même une rupture par rapport à ces langages.

    La seule chose que je ne comprends pas c'est le test systèmatique de 'initializer' comme fonction ? comme il est dans la cloture il aurait pu optimiser ça.

    Sur le fond, j'ai un peu de mal avec ses prises de position : il ne faut pas utiliser 'eval', 'switch', 'with', 'for(var', et je ne sais plus quoi encore. D'état d'esprit, je lui préfère Bjarne Stroustrup qui dit, en parlant du C++, quelque chose comme : utilisez n'importe quelle possibilité du langage tant que vous le faites à bon escient.


    Quoi qu'il en soit, bon article qui a le mérite d'exposer un point de vue argumenté.

  11. #31
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Crockford est un esthète, dès lors qu'une partie d'un langage ne lui paraît pas élégante, il n'hésite pas à la bannir complètement. Parfois ça tourne à l'extrémisme, mais généralement ses interventions pointent du doigt de manière pertinente des gros défauts du langage ; et je crois que new en fait partie. D'ailleurs, plus récemment, Crockford a déclaré aller encore plus loin en s'interdisant d'utiliser le mot-clé this et en le remplaçant par des références en closure.

    Tu remarqueras que j'ai parlé du problème de l'omission de new en dernier, car à mes yeux ce n'est pas le plus important (même s'il a toujours été source de nombreux bugs). Non, le vrai problème que j'y vois transparaît bien dans ton post:
    S'il avait conservé le 'new' cela aurait donné de la cohérence puisque qu'en général dans les langages de classe, 'new' est utilisé.
    Tout le problème est là. JavaScript n'est pas un langage de classes. JavaScript a été conçu comme un langage de programmation objet orientée prototype, et ce paradigme est incompatible avec le modèle de classe. Pourtant, pour séduire les développeurs Java et autres langages de classes, JavaScript a évolué avec new et bientôt avec class, pour arriver à un langage bâtard hybride. Cet entre-deux pose de nombreux problèmes de compréhension et est critiqué aussi bien par les défenseurs du modèle par classes que par ceux des prototypes. Le point 1 (obligation d'un constructeur) va à l'encontre du modèle prototype et le point 2 (héritage depuis instance) amène une certaine perplexité chez les habitués des classes. Le troisième point (omission du new) est juste un accident, un défaut pratique issu de cette hybridation.
    One Web to rule them all

  12. #32
    Membre averti
    Profil pro
    à la bougie alors
    Inscrit en
    Mai 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : à la bougie alors

    Informations forums :
    Inscription : Mai 2006
    Messages : 224
    Points : 362
    Points
    362
    Par défaut
    Citation Envoyé par SylvainPV Voir le message
    Tu remarqueras que j'ai parlé du problème de l'omission de new en dernier, car à mes yeux ce n'est pas le plus important (même s'il a toujours été source de nombreux bugs). Non, le vrai problème que j'y vois transparaît bien dans ton post:

    S'il avait conservé le 'new' cela aurait donné de la cohérence puisque qu'en général dans les langages de classe, 'new' est utilisé.
    Tout le problème est là. JavaScript n'est pas un langage de classes.
    1. Bin, j'aurais bien parlé aussi de l'héritage mais mon "post" était déjà suffisamment long alors comme ton titre était 'new, bonne ou mauvaise pratique' ...
    2. Euh ... je n'ai pas laissé sous entendre que Javascript était un langage de classes ?! La citation fait partie de la critique de son code. Sa fonction 'new_constructor' a visiblement, pour moi, une orientation langage de classes, et dans ce contexte 'S'il avait ...'

    Citation Envoyé par SylvainPV Voir le message
    JavaScript a évolué avec new et bientôt avec class, pour arriver à un langage bâtard hybride.
    Je ne comprends pas : tu veux dire que les premières versions de Javascript n'avait pas 'new' ? Je n'ai pas connu, même sous Netscape.

    Admettons qu'il soit un langage hybride, certains l'utilisent aussi comme un langage fonctionnel et alors ? Même en ES3, il était possible de se "passer" des constructeurs en implémentant une fonction comme 'Object.create'.

    Ceux qui veulent se passer des constructeurs le peuvent, ceux qui veulent les utiliser le peuvent aussi, ceux qui souhaitent faire autrement peuvent aussi l'envisager. L'essentiel, à mes yeux et de ne pas casser le fonctionnement du langage. Pas par position dogmatique, mais simplement parce que je pense que quelqu'un qui connait Javascript doit pourvoir comprendre n'importe quelle forme.

  13. #33
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Citation Envoyé par lysandro Voir le message
    ES5: introduction de 'Object.create' ... que permet cette fonction qu'on ne pouvait pas faire avant ? […]
    casser le graphe d'héritage.
    C'est essentiellement une pratique défensive. Dans un environnement comme Greasemonkey où on code depuis un niveau privilégié et où on se retrouve souvent à injecter du code dans la page (donc à un niveau non privilégié), il faut s'assurer que le code de la page ne va pas tenter d'obtenir des privilèges. Ces tentatives peuvent être très astucieuses, et un des moyens pour ça est de modifier le prototype de Object. Court-circuiter le graphe d'héritage permet de se protéger de ça.

    NB : mon exemple est biaisé car Greasmonkey a ses propres moyens de protection, mais c'était pour expliquer.

    Citation Envoyé par lysandro Voir le message
    C'est une approche. Je ne vois pas ce qu'elle apporte à part augmenter la confusion en créant des représentations qui ne sont pas celle du langage.
    Comme Sylvain t'a répondu, c'est la façon qu'a Crockford de transformer un aspect de Javascript qui lui déplaît. Cela dit, ta phrase est intéressante. En créant une nouvelle représentation il oblige l'utilisateur à s'adapter ; ce dernier va accepter ou non le temps d'adaptation comme s'il devait apprendre un nouveau langage ou un framework. En un sens, on peut dire que Crockford a tenté de créer un framework.

    Citation Envoyé par lysandro Voir le message
    Sur le fond, j'ai un peu de mal avec ses prises de position : il ne faut pas utiliser 'eval', 'switch', 'with', 'for(var', et je ne sais plus quoi encore.
    Pour le switch est-ce que tu fais référence à ça ? Attention il n'est pas à 100% contre le switch. Il est contre les « fallthru » que je traduirais par « case en cascade » (casecade ? ), c'est-à-dire le fait d'oublier volontairement un break pour réutiliser du code.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  14. #34
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Je me suis mal exprimé en voulant évoquer class. Je voulais dire par là que JavaScript a évolué vers une programmation de plus en plus orientée objet et reposant sur new. new a été ajouté dès JavaScript 1.0, par Brendan Eich lui-même si je ne m'abuse. Il était déjà utilisé avec les objets de base comme Date ou Array. Mais il faut rappeler que JavaScript a été écrit en quelques semaines, et que le langage présente des défauts majeurs reconnus par B.E. Le mot-clé new a plusieurs fois été remis en question, et ce depuis fort longtemps : https://esdiscuss.org/topic/obsoleting-the-new-keyword

    Certains voient dans ce mélange de paradigmes une force du langage, d'autres y voient un manque de cohérence. D'autres encore, dont je fais partie, regrettent qu'un langage devenu si populaire n'assume pas sa nature orientée prototypes, et vienne se fondre dans le moule de l'apprentissage traditionnel de la programmation objet à base de classes. Pour la majorité des développeurs, les classes sont l'unique forme de programmation objet et c'est bien dommage. On aurait pu espérer que JavaScript ait assez de carrure pour faire enseigner la programmation orientée prototype dans les écoles.
    One Web to rule them all

  15. #35
    Membre émérite
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Points : 2 778
    Points
    2 778
    Par défaut
    tu veux dire que les premières versions de Javascript n'avait pas 'new'
    new a été ajouté dès JavaScript 1.0, par Brendan Eich lui-même si je ne m'abuse
    Tu ne t'abuses pas !

    new a été introduit avec Netscape 2.0, JavaScript 1. (source - Spéc opérateur new).
    On peut donc dire qu'il n'y avait pas de mot-clé new dans le moteur JavaScript de Netscape Navigator 1.0. En fait, il n'y avait pas de JavaScript tout court car Eich a créé JavaScript de mai à décembre 1995 si on en croit la légende. (source).

    Donc oui, il y a toujours eu new dans le langage

  16. #36
    Membre averti
    Profil pro
    à la bougie alors
    Inscrit en
    Mai 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : à la bougie alors

    Informations forums :
    Inscription : Mai 2006
    Messages : 224
    Points : 362
    Points
    362
    Par défaut
    @Watilin
    Je crois comprendre ce que tu veux dire (pas sûr d'avoir le bagage), je ne pense pas que cela justifie nécessairement l'apparition de 'Object.create' : est-ce que c'est un trou majeur de sécurité dans le langage ou un problème d'environnement ? si oui : est-ce la meilleure façon de le résoudre ?
    Toutefois, pour rejoindre ton deuxième point concernant l'obligation d'adaptation de l'utilisateur, je trouve 'Object.create' bien plus interessant que sa(Crockford) fonction bancale, pour les raisons pré-cités. Je ne critique pas en soi 'Object.create', j'essayais de mettre en avant que l'introduction de nouvelles fonctionnalités dans le langage pouvaient aussi poser question.
    Pour le 'switch', oui c'est ça, je ne voulais pas faire un roman alors j'ai raccourci (c'est pas bien). Il n'aime pas non plus les opérateurs de pré et post incrémentation (resp décrémentation) quand je pense qu'il était développeur C ...

    @SylvainPV
    N'ayant pas pratiqué de langages à prototypes, je n'ai pas trop vu le mélange. mais il est clair que j'y prends plaisir. Ce n'est pas un langage de classes, apparement ce n'est pas non plus complétement un langage à prototypes. Bien que j'ai cru comprendre qu'il était plus influencé par ces derniers. D'ailleurs à quand un 'Object.setPrototypeOf()' qui irait trés bien à sa nature dynamique.
    Plutot que de te plaindre que les prototypes aient des constructeurs, réjouis toi que les constructeurs aient des prototypes ! (désolé)
    Ce que je veux dire c'est que pour quelqu'un qui semble militer pour sa nature prototypale auprès de développeurs "classieux", c'est plutot un excellent langage de pont, non ?
    Ton dernier point, avec lequel je suis d'accord, soulève une question qui relève de l'apprentissage et non du langage lui même.

    Ce que je regrette un peu, c'est qu'on dézingue beaucoup ce langage qui a pourtant des qualités indéniables.

    NB: je ne suis pas développeur, j'en ai fait, mais il a trop longtemps maintenant pour me considérer comme tel.

  17. #37
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 125
    Points : 149
    Points
    149
    Par défaut
    Personnellement, ayant commencé à toucher au JS en connaissant principalement des langages orientés objets, j'ai pris la fâcheuse habitude de me servir de "new" et de passer par des constructeurs.
    Malgré tout, j'ai toujours trouvé que quelque chose ne tournait pas rond dans tout ça (new Date(), wtf ??), et je m'en suis rendu compte lorsque j'ai compris la "logique" de javascript, qui n'a rien à voir avec un langage de classes.

    Alors après j'aurais bien envie de changer ma façon de coder pour mieux "coller" avec l'esprit js, mais "new" est tellement ancré dans mes habitudes que j'ai développé une peur profonde de ".prototype".

    Je trouve qu'il est intéressant d'avoir permis cette façon de coder qui colle à la POO (et ça me colle littéralement à la peau...), mais je déplore que par ce biais, javascript en perde de sa contenance, ajoute un autre moyen de faire "la même chose" (pas très optimal selon moi...), et ajoute un argument de plus à la problématique "où va-t'on avec javascript ?"

  18. #38
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Object.setPrototypeOf existe déjà en fait Mais il est déconseillé de modifier à la volée le prototype d'un objet, ça sort un peu du cadre.

    On pourrait effectivement voir JavaScript comme un langage de pont, ce qui serait une excellente chose à condition que le pont ne soit pas branlant et ne penche dans le mauvais sens. Or ça semble être le cas avec l'arrivée du mot-clé class dans ES6 par exemple, qui divise beaucoup la communauté.

    J'aime à penser que JS se fait "dézinguer" justement par les personnes qui l'affectionnent le plus, qui le connaissent bien et se désolent de voir que ses aspects les plus intéressants soient oubliés. Personnellement j'adore le JavaScript ; j'en fais depuis dix ans maintenant, dont trois professionnellement, et je découvre sans cesse de nouvelles choses avec (cf mon topic sur l'utillisation des getters ES5). Mais ceux qui le découvrent ou le pratiquent plus occasionnellement ne peuvent pas avoir ce recul, ce qui explique pourquoi JavaScript est réputé pour sa facilité à produire du code "sale". Ce n'est pas pour rien que le best-seller de Crockford s'intitule "JavaScript: The Good Parts".

    Le témoignage de kaari kosaku rejoint exactement ce que je veux dire, comment en est-on arrivé à avoir peur des prototypes alors qu'ils sont un des piliers fondateurs du langage ?
    One Web to rule them all

  19. #39
    Membre averti
    Profil pro
    à la bougie alors
    Inscrit en
    Mai 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : à la bougie alors

    Informations forums :
    Inscription : Mai 2006
    Messages : 224
    Points : 362
    Points
    362
    Par défaut
    Le code "sale" c'est quand même d'abord les développeurs qui le produisent. C'est une vieille antienne rabachée pour le basic, le C, etc. bref tous les langages (+/- populaires) qui n'imposent pas de façon stricte de coder.

    Si je compare 'new' à 'Object.create' :

    'new'
    - crée un nouvel objet,
    - établit le lien d'héritage entre cet objet et le prototype de la fonction,
    - appelle cette fonction en liant 'this' à l'objet créé et en lui passant les arguments,
    - renvoi le retour de l'appel si c'est un objet, l'objet créé initialement sinon.

    'Object.create'
    - crée un nouvel objet,
    - établit le lien d'héritage entre cet objet et son premier argument,
    - crée dans l'objet, les propriétés de son second argument
    - renvoi l'objet

    Il y a bien des différences, mais on fait presque la même chose. Où ça bloque ?

  20. #40
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Les inconvénients de new et les avantages de Object.create sont précisément l'objet de ce topic, je te renvoie donc à tous les posts précédents. Mais je ne me souviens pas avoir parlé de blocage
    One Web to rule them all

Discussions similaires

  1. Surcharge de l'opérateur new
    Par :Bronsky: dans le forum C++
    Réponses: 17
    Dernier message: 27/10/2010, 21h33
  2. Grain de sel aléatoire, bonne ou mauvaise pratique ?
    Par Sergejack dans le forum Sécurité
    Réponses: 1
    Dernier message: 13/08/2009, 10h18
  3. Mauvaise pratique ? throw new exception()
    Par AsPrO dans le forum Langage
    Réponses: 4
    Dernier message: 24/04/2009, 11h36
  4. Redéfinition opérateurs new et delete globaux
    Par bolhrak dans le forum C++
    Réponses: 8
    Dernier message: 30/07/2007, 11h34
  5. namespace et opérateur new
    Par Sylvain Rousseau dans le forum C++
    Réponses: 3
    Dernier message: 06/01/2005, 23h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo