101 votes

Objet, classe et fonction

Je me demandais : quelle est la différence entre les objets, les classes et les fonctions JavaScript ? Ai-je raison de penser que les classes et les fonctions sont des types d'objets ?

Et qu'est-ce qui distingue une classe d'une fonction ? Ou bien s'agit-il vraiment de la même chose, le terme changeant simplement en fonction de l'utilisation qui en est faite ?

function func() { alert('foo'); } // a function
func(); // call the function - alerts 'foo'
var func2 = function () { alert('hello'); } // acts the same way as 'func' surely?
func2(); // alerts 'hello'

var Class = function() { alert('bar'); }; // a class
var c = new Class(); // an istance of a class - alerts 'bar'

Bien sûr, les classes ont des méthodes et des propriétés et peuvent être instanciées - mais je pourrais faire de même avec n'importe quelle vieille fonction - ou pas ?

90voto

Aadit M Shah Points 17951

Comme vous devez déjà le savoir, il n'existe pas de classes en JavaScript. Au lieu de cela, les fonctions en JavaScript peuvent se comporter comme des constructeurs en faisant précéder l'appel de fonction de l'attribut new mot-clé. C'est ce que l'on appelle le modèle de construction .

En JavaScript, tout est un objet, à l'exception des types de données primitifs (booléen, nombre et chaîne de caractères), et undefined . D'autre part null est en fait une référence d'objet, même si vous pouvez croire le contraire au premier abord. C'est la raison pour laquelle typeof null renvoie à "object" .

Les fonctions en JavaScript sont similaires aux functables en Lua (c'est-à-dire que ce sont des objets appelables). Une fonction peut donc être utilisée à la place d'un objet. De même, les tableaux sont également des objets en JavaScript. D'autre part, les objets peuvent être considérés comme des tableaux associatifs.

Le point le plus important est cependant qu'il n'y a pas de classes en JavaScript car JavaScript est un langage orienté objet prototypique. Cela signifie que les objets en JavaScript héritent directement d'autres objets. Nous n'avons donc pas besoin de classes. Tout ce dont nous avons besoin est un moyen de créer et d'étendre des objets.

Lisez le fil de discussion suivant pour en savoir plus sur l'héritage prototypique en JavaScript : Avantages de l'héritage prototypique par rapport à l'héritage classique ?

49voto

Neoaptt Points 1405

Mise à jour 2015

Il existe des classes en JavaScript, mais elles ne sont pas utilisées sur les anciens navigateurs :

Compatibility screenshot

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

Il possède des constructeurs, des extensions, etc.

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

  speak() {
    console.log(this.name + ' makes a noise.');
  }
}

class Lion extends Cat {
  speak() {
    super.speak();
    console.log(this.name + ' roars.');
  }
}

12voto

mishik Points 7141

JavaScript n'a pas de classes, et les fonctions sont en fait des objets en JavaScript (citoyens de première classe). La seule différence que les objets de fonction ont est qu'ils sont Appelable .

function func() { alert('foo'); } // a function - Correct

func(); // call the function - alerts 'foo' - Correct

var func2 = function () { alert('foo'); } // same as 'func' surely? - Non, func2 est un objet différent, qui apparemment fait la même chose lorsqu'il est appelé.

var Class = function() { alert('bar'); }; - C'est une fonction sans nom stockée dans la variable Class .

var c = new Class(); - Appelle la fonction stockée dans Class fournissant un nouvel objet vide comme this et de renvoyer cet objet. Les fonctions appelées new functionA() sont censés fonctionner comme des constructeurs et préparer un objet nouvellement créé ( this ). Dans votre cas, le constructeur ne fait rien avec l'objet et ne fait qu'alerter bar .

6voto

ShanaSkydancer Points 21

Vous obtenez également des classes dans ES6 qui ressemblent à ceci :

//class
class Cat {
    //constructor
    constructor() {
        this.name = 'Snowball';
    }

    //method
    meow() {
        console.log('Hello, nyah! My name is ' + this.name + ' nyah!~');
    }
};

4voto

Tala Points 4836

Il n'y a pas de classes en javascript. Mais, il existe des moyens de faire en sorte qu'une fonction se comporte comme une classe dans d'autres langages.

Une très bonne explication est donnée ici 3 façons de définir une classe en js

J'ai également trouvé une très bonne référence pour La POO en Javascript

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X