489 votes

JavaScript : Class.method vs Class.prototype.method

Quelle est la différence entre les deux déclarations suivantes ?

Est-ce OK de penser à la première instruction comme une déclaration d’une méthode statique et la seconde déclaration comme une déclaration d’une méthode d’instance ?

692voto

CMS Points 315406

Oui, la première fonction n'a pas de relation avec un objet instance de la fonction constructeur, vous pouvez le considérer comme une 'méthode statique'.

Dans les fonctions JavaScript sont de première classe des objets, cela signifie que vous pouvez les traiter comme n'importe quel objet, dans ce cas, vous êtes seulement l'ajout d'une propriété à la fonction d'objet.

La deuxième fonction, comme vous étendez le constructeur de prototype de fonction, il sera disponible à toutes les instances de l'objet créé avec l' new mot-clé, et le contexte à l'intérieur de cette fonction ( this mot-clé) reportez-vous à la réelle instance de l'objet d'où vous appeler.

Considérons cet exemple:

// constructor function
function MyClass () {
  var privateVariable; // private member only available within the constructor fn

  this.privilegedMethod = function () { // it can access private members
    //..
  };
}

// A 'static method', it's just like a normal function 
// it has no relation with any 'MyClass' object instance
MyClass.staticMethod = function () {};

MyClass.prototype.publicMethod = function () {
  // the 'this' keyword refers to the object instance
  // you can access only 'privileged' and 'public' members
};

var myObj = new MyClass(); // new object instance

myObj.publicMethod();
MyClass.staticMethod();

18voto

user2440156 Points 37

Lorsque vous créez plusieurs instances de MyClass, vous aurez toujours qu’une seule instance de publicMethod en mémoire, mais dans le cas de privilegedMethod, que vous finirez par la création de lots d’instances et de staticMethod n’a aucune relation avec une instance d’objet.

C’est pourquoi prototypes économiser de la mémoire.

En outre, si vous modifiez les propriétés de l’objet parent, est la propriété correspondante de l’enfant n’a pas été changée, il va être mis à jour.

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