web-dev-qa-db-fra.com

Objet vs classe vs 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 sont-ils vraiment la même chose, juste le terme pour eux change en fonction de la façon dont ils sont utilisés?

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 alors, je pourrais faire la même chose avec n'importe quelle ancienne fonction - ou pas?

54
Sean Bone

Comme vous devez déjà le savoir, il n'y a pas de classes en JavaScript. Au lieu de cela, les fonctions en JavaScript peuvent se comporter comme des constructeurs en faisant précéder un appel de fonction avec le mot clé new. Ceci est connu sous le nom constructeur .

En JavaScript, tout est un objet à l'exception des types de données primitifs (booléen, nombre et chaîne) et de undefined. D'autre part, null est en fait une référence à un objet, même si vous croyez au contraire autrement. C'est la raison typeof null résultats "object".

Les fonctions en JavaScript sont similaires aux fonctions dans Lua (c’est-à-dire qu’elles sont des objets appelables). Par conséquent, une fonction peut ê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 qu’il n’ya pas de classes en JavaScript, car JavaScript est un langage prototypal orienté objet. Cela signifie que les objets en JavaScript héritent directement d'autres objets. Par conséquent, nous n'avons pas besoin de cours. Tout ce dont nous avons besoin est un moyen de créer et d’étendre des objets.

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

51
Aadit M Shah

Mise à jour 2015

Il existe des classes en javascript, elles ne sont tout simplement pas utilisées sur les anciens navigateurs. enter image description here

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

Il a 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.');
  }
}
33
Neoaptt

Une classe en JS:

function Animal(){  

    // Private property
    var alive=true;

    // Private method
    function fight(){ //... }   

    // Public method which can access private variables
    this.isAlive = function() { return alive; } 

    // Public property
    this.name = "Joe";
}

// Public method
Animal.prototype.play = function() { alert("Bow wow!"); }

// .. and so on

Maintenant, quand vous créez son objet

var obj = new Animal();

Vous pouvez vous attendre à quoi que ce soit de cet objet comme vous le feriez des objets dans un autre langage. Les efforts pour y parvenir étaient un peu différents. Vous devriez également regarder héritage en JS .


Pour revenir aussi à votre question, je la reformulerai ainsi:

Class  : A representation of a set with common properties.
object : One from the set with the same properties.


var Class = function() {alert('bar');}; // A set of function which alert 'bar'
var object = new Class();               // One of the functions who alert's 'bar'.
15
loxxy

JavaScript n'a pas de classes et les fonctions sont en réalité des objets en JavaScript (citoyens de première classe). La seule différence entre les objets fonction est qu’ils sont appelables.

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

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

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

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

var c = new Class(); - Appelle une fonction stockée dans Class fournissant un nouvel objet vide sous la forme this et renvoyant cet objet. Les fonctions appelées new functionA() sont censées fonctionner en tant que constructeurs et préparer un objet nouvellement créé (this). Dans votre cas, le constructeur ne fait rien avec l'objet et alerte simplement bar.

8
mishik

Il n'y a pas de classes en javascript. Mais, il y a moyen de créer une fonction qui se comporte comme une classe dans d'autres langues.

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

En outre, nous avons trouvé une très bonne référence pour OOP en Javascript

3
Tala

Object est le type de base en JavaScript, c'est-à-dire que tous les types de données définis par l'utilisateur héritent de Object d'une manière ou d'une autre. Donc, si vous définissez une fonction ou une classe [remarque, JS ne prend pas en charge la construction de classe, mais sa construction dans ECMAScript version 6], il héritera implicitement du type Object.

Les classes sont vraiment utilisées pour encapsuler des fonctions et propriétés logiques dans un seul type/entité et vous pouvez la "créer" à l'aide de la syntaxe du constructeur. Ainsi, si vous définissez une classe 'Client', vous pouvez l'instancier plusieurs fois et chaque instance/objet peut avoir des valeurs différentes. Ils peuvent même partager les valeurs si vous définissez la valeur au niveau de la classe à l'aide de prototype.

Comme JS ne prend pas en charge la construction de classe pour le moment, les fonctions peuvent réellement servir de méthode individuelle ainsi que de conteneur pour d'autres fonctions ou types.

J'espère qu'avec ECMAScript 6, nous aurons une séparation claire entre ces constructions similaires à celles que nous avons dans d'autres langages tels que C #, Java etc.

2
Prasad Honrao

Vous obtenez également des cours 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!~');
    }
};
1
ShanaSkydancer