Vous trouverez ci-dessous deux façons de définir des méthodes sur des objets créés avec le mot clé new
. J'essaie de comparer les fonctionnements et les effets de chacun.Comment fonctionne fun.call lorsque la valeur de thisArg fournie pour l'appel à fun est un objet Function.prototype?
1) Un mélange fonctionnel asCircle
est défini. Puis .call
injecte le mélange dans Circle.prototype
par délégation. L'effet est que les new Circle
instances ont maintenant des méthodes telles que .area
mélangés.
var asCircle = function() {
this.area = function() {
return Math.PI * this.radius * this.radius;
};
this.grow = function() {
this.radius++;
};
this.shrink = function() {
this.radius--;
};
return this;
};
var Circle = function(radius) {
this.radius = radius;
};
asCircle.call(Circle.prototype);
var circle1 = new Circle(5);
var circle2 = new Circle(6);
console.log(circle1.area());
2) Une fonction Circle
est défini comme un constructeur avec une propriété radius
. Les fonctions sont ensuite affectées aux propriétés Circle.prototype
. Effectivement toutes les instances new Circle
peuvent maintenant appeler ces méthodes par exemple .area()
.
var Circle = function(radius) {
this.radius = radius;
};
Circle.prototype.area = function() {
return Math.PI * this.radius * this.radius;
};
Circle.prototype.grow = function() {
this.radius++;
};
Circle.prototype.shrink = function() {
this.radius--;
};
var circle1 = new Circle(5);
var circle2 = new Circle(6);
console.log(circle1.area());
En voyant la mise en œuvre 1 J'ai été surpris de voir que .area
pourrait être réutilisé sur tout nouveau Cercle simplement en appelant la fonction asCircle
avec Circle.prototype
comme thisArg.
Pourquoi est l'effet de l'utilisation de la mise en œuvre .call
1 la même que la définition de ces méthodes directement sur Circle.prototype
comme dans la mise en œuvre 2?