gpt4 book ai didi

javascript - 当为 fun 调用提供的 thisArg 值是 Function.prototype 对象时,fun.call 如何工作?

转载 作者:行者123 更新时间:2023-12-02 13:48:32 24 4
gpt4 key购买 nike

下面是在使用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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com