下面是在使用new
创建的对象上定义方法的两种方法。关键词。我正在尝试比较每种方法的工作原理和效果。
1) 函数式 mixin asCircle
被定义为。然后.call
将 mixin 注入(inject) 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) A Circle
函数被定义为带有 radius
的构造函数属性(property)。然后将功能分配给 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 上重复使用函数 Circle.prototype
作为thisArg。
为什么使用.call
的效果是这样的在实现 1 中,与在 Circle.prototype
上直接定义这些方法相同与实现 2 一样?
最佳答案
在第一个代码片段中
1.“Call”更改“this”的上下文。当您调用 asCircle.call(Circle.prototype) 时,将调用 asCircle,其中“this”为 Circle.prototype
2.所有方法area/grow和shrink都被添加到原型(prototype)中,其效果与第二个代码片段相同
希望这有帮助
关于javascript - 当为 fun 调用提供的 thisArg 值是 Function.prototype 对象时,fun.call 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41177670/