方法必须在一个被链接在一起的对象中吗?

Kev*_*vvv 1 javascript constructor function object

我试图理解链接函数在JavaScript中是如何工作的.我有两个例子:

第一

    class Arithmetic {
      constructor() {
        this.value = 0;
      }
      add(value) {
        this.value = this.value + value;
        return this;
      }
     subtract(value) {
     this.value = this.value - value;
     return this;
     }
   }
Run Code Online (Sandbox Code Playgroud)

您可以通过实例化let a = new arithmetic();和链接方法a.add(3).subtract(4);

第二

var zappo = function(selector) {
  var el;

  var obj = {
    getEl(selector) {
    return document.querySelector(selector);
    },
    addClass(className){
    el.classList.add(className);
    return this;
    }
  }

  el = getEl(selector);
  return obj;
}
Run Code Online (Sandbox Code Playgroud)

我可以通过链接这些方法 zappo(#main).addClass("green").addClass("red");

我的问题是为什么第一个构造函数能够在没有对象内的方法的情况下链接函数,而第二个函数需要所有方法都在一个对象中?

T.J*_*der 6

我的问题是为什么第一个构造函数能够在没有对象内的方法的情况下链接函数...

他们的方法在对象,因为该对象从它的原型继承,并且所述方法对原型定义.

方法必须在一个被链接在一起的对象中吗?

根据定义,方法只能在对象(或有效但不是字面上被提升为对象的JavaScript的基元)上访问,因为否则我们称它们为函数,而不是方法.

链接方法并不特别.所有当你做你正在做的x.a().b()呼吁ax,然后调用b上不管它是什么a回报.在您的class示例中,每个方法都return this这样做,每个方法都返回它被调用的对象.但是x.a().b()当你a返回一个不是 的对象时,你可以很容易地使用它x.这实际上很常见.例:

document.querySelector("div").addEventListener(/*...*/);
Run Code Online (Sandbox Code Playgroud)

querySelector不返回document,它返回找到的元素.以上假设将找到并返回一个元素(而不是querySelector返回null)并调用addEventListener该元素.