Ниже приведены два способа определения методов для объектов, созданных с помощью ключевого слова new
. Я пытаюсь сравнить действия и эффекты каждого из них.Как работает fun.call, когда значение thisArg, предоставленное для вызова развлечения, является объектом Function.prototype?
1) Определен функциональный микс asCircle
. Затем .call
вводит смесь в Circle.prototype
делегацией. Эффект состоит в том, что экземпляры new Circle
теперь имеют такие методы, как .area
размешивали.
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) Circle
функция определяется как конструктор с radius
собственности. Затем функции назначаются Circle.prototype
свойствам. Фактически любые экземпляры new Circle
теперь могут вызывать эти методы, например .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());
Увидав реализацию 1 я опешил, видя, что .area
может быть использован на любом новом Круге просто путем вызова функции asCircle
с Circle.prototype
как thisArg.
Почему эффект от использования .call
в реализации 1 так же, как определить эти методы непосредственно на Circle.prototype
как в реализации 2?