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

标签 javascript functional-programming prototype mixins

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

相关文章:

javascript - Swiper Slider 将所有幻灯片放在一张幻灯片中

javascript - react 中的模糊并没有关闭我的导航菜单

haskell - 了解作家类型

java - 如何在 scala 中使用函数式编程过滤列表?

javascript - 如何在另一个函数的回调中调用 JavaScript 函数?

javascript - Flotr x 轴日期/时间

javascript - 如何将选中的复选框一次限制为一个?

javascript - 我将如何在添加到表中的一组新行上使用 jQuery 的 slideDown()?

haskell - 使用 beta reduce

JavaScript 模块模式/原型(prototype)模式 : can't figure out this code