web-dev-qa-db-fra.com

Est-ce que JavaScript a des cours?

Un ami et moi avons eu une dispute la semaine dernière. Il a déclaré qu’il n’existait pas de classe JavaScript.

J'ai dit qu'il y avait comme vous pouvez dire var object = new Object()

Il dit "comme il n'y a pas de mot class utilisé. Ce n'est pas une classe."

Qui a raison?


Comme une note; Pour l'avenir, vous avez besoin d'une mise en œuvre succincte de Classy JS:

https://github.com/tnhu/jsface


Edit: Juillet 2017

Les classes JavaScript introduites dans ECMAScript 2015 sont principalement du sucre syntaxique par rapport à l'héritage existant de JavaScript basé sur un prototype. La syntaxe de la classe n'introduit pas un nouveau modèle d'héritage orienté objet dans JavaScript. Les classes JavaScript fournissent une syntaxe beaucoup plus simple et claire pour créer des objets et gérer l'héritage.

- Classes Mozilla ES6: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Classes

61
Glycerine

Techniquement, la déclaration "JavaScript n'a pas de classes" est correcte.

Bien que JavaScript soit un langage orienté objet, ce n'est pas un langage basé sur class - c'est un langage basé sur prototype . Il existe des différences entre ces deux approches, mais comme il est possible d'utiliser JavaScript comme un langage basé sur les classes, de nombreuses personnes (y compris moi-même) se réfèrent souvent aux fonctions du constructeur comme des "classes".

88
Steve Harrison

Javascript est un langage de programmation orienté objet. Néanmoins, en 2015, 6 classes ont été introduites avec le script ECMA et il est maintenant correct de les utiliser comme les autres langages basés sur les classes comme Java. Bien sûr, comme l'a indiqué le codemagician de l'utilisateur dans son commentaire, il existe des différences profondes entre le fonctionnement des classes en js et Java ou d'autres langages de programmation "basés sur les classes".

Néanmoins, maintenant en programmation js, il est possible d’utiliser par exemple un code comme:

class Animal { 
  constructor(name) {
    this.name = name;
  }


class Dog extends Animal {
  speak() {
    console.log(this.name + ' barks.');
  }
}

Source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes

Cela a quelque chose en commun avec les langages classiques basés sur les classes ..___ Le problème reste le support du navigateur pour cette nouvelle technologie qui ne fait que commencer. Donc, il n'est toujours pas bon de l'utiliser sur des produits de production. Mais je ne doute pas que ce problème sera résolu rapidement.

La question reste donc de savoir si js est devenu un langage de programmation basé sur les classes en raison de la mise en œuvre de cette nouvelle fonctionnalité ou reste-t-il toujours un langage de programmation orienté prototypage objet.

22
willy wonka

En Javascript, pratiquement tout est une object (les objets peuvent hériter d’autres objets). Il n’a pas classes au sens classique.

Bien que vous puissiez reproduire la plupart des fonctionnalités de la définition/instanciation de classe traditionnelle par le prototypage de fonctions.

8
ChristopheD

Écoutez le discours de Douglas Crockford ici:
http://developer.yahoo.com/yui/theater/video.php?v=crockonjs-2

Il aborde directement votre question dans sa présentation: 

La caractéristique la plus controversée de la langue est la façon dont elle hérite, ce qui est radicalement différent de pratiquement toutes les autres langues modernes. La plupart des langues utilisent des classes - je les appelle «langues classiques», mais pas JavaScript. JavaScript est gratuit. Il utilise des prototypes. Pour les personnes ayant une formation classique qui regardent la langue, elles vont: eh bien, c'est déficient. Vous n’avez pas de cours, comment pouvez-vous faire quelque chose? Comment pouvez-vous avoir la certitude que la structure de votre programme fonctionnera? Et ils ne dépassent jamais cela. Mais il s'avère que…

7

Par "langage X a des classes", on entend généralement le support de la programmation orientée objet.

Oui, Javascript est un langage orienté objet.

5

Quand je pense aux classes, je pense aux types et au fait que les classes me permettent de définir de nouveaux types. En js, vous ne pouvez pas créer de nouveaux types. Vous pouvez faire toutes sortes de choses fantaisistes avec des prototypes, mais le fait que tout soit toujours un objet touche vraiment à la nature sans classe de js. Je pense que les gens qui utilisent la terminologie 'class' pour parler de js confondent js en tant que langage prototype et que js en tant que langage classique, encore plus que le nouvel opérateur moche. En bref, ce n'est pas parce que js est OO que les classes doivent exister.

2
fthinker

Pour ajouter avec les autres réponses, javascript n'a pas de classes, bien que je commence à voir des déclarations où il est décrit comme quelque chose qui ressemble à des classes, mais je crois que cela ne fait que brouiller les cartes.

JavaScript a des prototypes, pas des classes, mais ils accomplissent la même chose, les prototypes sont des objets qui définissent des objets, d’où la confusion. 

Un prototype est une représentation de l'état interne privé qu'une classe gérerait en Java par exemple. Au lieu de placer cet état interne dans une classe et de présenter une interface pour manipuler le comportement, comme en Java, JavaScript expose la structure de données à manipuler directement par les programmes JavaScript.

C'est la meilleure description que j'ai trouvée sur le sujet, Les prototypes ne sont pas des classes .

1
James Drinkard

Du livre-vous-ne-savez-pas-JS sur https://github.com/getify/You-Dont-Know-JS

Chapitre 4: Mélanger (monter) des objets "Class"

...

JS a depuis quelques temps des éléments syntaxiques de type classe (comme new et Instanceof), et plus récemment dans ES6, certains des ajouts, comme le mot-clé de classe.

Mais cela signifie-t-il que JavaScript a effectivement des classes? Clair et simple: Non

Je ne vais pas copier et coller d’autres parties ici, mais encourager à lire chapitre 3 & chapitre 4 et à exécuter des exemples.

https://github.com/getify/You-Dont-Know-JS/blob/master/this%20%26%20object%20prototypes/ch3.mdhttps: // github. com/getify/Vous-ne-savez pas-JS/blob/maître/this% 20% 26% 20object% 20prototypes/ch4.md

1
Alireza Fattahi

En termes simples - Oui. Babel.js est tout ce dont vous avez besoin, car tous les navigateurs ne le prennent pas en charge, à l'exception du navigateur Chrome. Une classe JavaScript est un type de fonction. Les classes sont déclarées avec le mot-clé class. Nous utilisons la syntaxe d'expression de fonction pour initialiser une fonction et la syntaxe d'expression de classe pour initialiser une classe.

Voici un exemple de classe JavaScript utilisant la fonction:

class Rectangle {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
  // Getter
  get area() {
    return this.calcArea();
  }
  // Method
  calcArea() {
    return this.height * this.width;
  }
}

const square = new Rectangle(10, 10);

console.log(square.area); // 100

1
Mandeep Kaur

Bien que JavaScript ne contienne pas de classes antérieures à ES6, un comportement semblable à celui d'une classe peut être implémenté dans ES5 en scellant des objets (rendant ainsi les objets non extensibles). Dans un objet scellé, les nouvelles propriétés et méthodes ne peuvent pas être ajoutées et les propriétés ne sont pas configurables. Les propriétés valeurs peuvent toujours être définies et lues. Je dis classe, parce qu'il y a une mise en garde. Les définitions de méthode d'un objet scellé peuvent toujours être modifiées. En effet, les valeurs de propriété peuvent toujours être définies, à moins que vous ne modifiiez toutes les propriétés de la méthode pour qu'elles ne soient plus accessibles en écriture. À ce stade, vous avez reproduit le comportement de la classe de manière très proche à l'aide de ES5.

0
Puneet Lamba