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?
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?
Il existe des classes en javascript, elles ne sont tout simplement pas utilisées sur les anciens navigateurs.
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.');
}
}
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'.
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
.
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
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.
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!~');
}
};