如何在js中创建对象链

时间:2019-01-23 00:30:04

标签: javascript

在一次采访中我被要求解决

init(1).add(2).mul(3).div(4).val();

输出它应该实现此功能,我更关心如何以上述方式调用

(1 + 2)* 3/4 = 2.25

我们如何使用javascript实现它?我想到用嵌套函数创建函数,正确的方法是什么?

我做了

var gmap = function(num) {
this.x = num;

this.add = function(ad) {
    this.x = this.x * ad;
    return this;
}

this.del = function(de) {
   this.x = this.x + de;
   return this;
}

this.final = function() {
    return this.x;
}

}

3 个答案:

答案 0 :(得分:3)

您也可以使用class风格

class Chainable{

    init(num){
        this.total = num;
        return this;
    }

    add(num){
        this.total += num;
        return this;
    }
}

像这样使用它

var c = new Chainable();
c.init(1).add(1);

答案 1 :(得分:0)

如果您不想使用类的实例,则可以使用闭包:

function init(start) {
  // this is the starting value that will get updated with each function call
  let value = start;

  // This is the object to be returned, notice that seach return the object instance
  let self = {
      add: num => {
          value += num;
          return self;
      },
      sub: num => {
          value -= num;
          return self;
      },
      mul: num => {
          value *= num;
          return self;
      },
      div: num => {
          value /= num;
          return self;
      },
      val: () => {
          return value;
      }
  };

  return self;
}

init(1).add(2).mul(3).div(4).val(); // 2.25

基本上,每次调用init函数时,都会创建一个新的闭合作用域。在此范围内,创建并只能在该范围内访问的任何局部变量的新实例。

调用init函数时,将创建两个新的变量实例valueself,这些实例只能由init函数中创建的其他“事物”访问。

对于每个函数,我们将返回包含函数集的变量,该变量集是函数链接调用的方式。

答案 2 :(得分:0)

您可以使用builder patternES6)做这样的事情:

function init(value) {
    this.result = value;
    return {
        add: function(addValue) {
            this.result = this.result + addValue;
            return this;
        },
        mul: function(mulValue) {
            this.result = this.result * mulValue;
            return this;
        },
        div: function(divValue) {
            this.result = this.result / divValue
            return this;
        },
        val: function() {
            return this.result;
        },
        result: this.result,
    };

}

init(1).add(2).mul(3).div(4).result