【问题标题】:Method chaining in JSJS中的方法链
【发布时间】:2019-11-04 11:10:23
【问题描述】:

让我们这样说:

var method = function(number) {
  this.number = number;

  this.add = function(param) {
    this.number = this.number + param;
    return this
  }
  this.multiply = function(param) {
    this.number = this.number * param;
    return this.number
  }

}

如果我这样做:

var newMeth = new method(2);
var result = newMeth.add(2).multiply(2);
console.log(result) // Will return 8

但我主要关心的是我是否想这样做:

var newMeth = new method(2);
var result = newMeth.add(2);

我想知道在这种情况下怎么可能会产生这样的结果 返回“4”而不是method {number: 4, add: ƒ, multiply: ƒ}

但如果我这样做了,仍然返回 8

var result = newMeth.add(2).multiply(2);

任何帮助将不胜感激。谢谢大家。

【问题讨论】:

  • 您不能直接执行此操作。我认为您无法说服 console.log 使用任何特定值来表示您的对象。最有可能的是,在一般情况下这是不可能的,因为console.log 严重依赖于实现。但是,您可以在对象上使用返回值的方法 - 例如 new method(2).add(2).multiply(7).getValue()。如果您将方法命名为valueOf,那么它将在转换为原始方法时被调用,因此您可以使用new method(2).add(2).multiply(7) + 5 并从操作中得到一个纯数字。

标签: javascript oop methods


【解决方案1】:

你可以在你的链上定义 val() 方法来返回数字,并像这样使用它:

var result = newMeth.add(2).multiply(2).val();
// OR
var result = newMeth.add(2).val();
// OR
var result = newMeth.val();

【讨论】:

  • 非常感谢!是的,我只是想知道是否可以选择返回值或返回对象,具体取决于乘法是否在加法之后。
  • 你不能选择返回值,你也不应该。最好明确说明您的代码的作用。隐式类型转换会降低代码的可读性并带来错误。 valueOf(),正如其他人所提到的,与“选择返回类型”一样接近。
【解决方案2】:

您可以定义valueOf method on your object。您可以显式调用它来获取数字,但在将对象转换为原语时也会隐式调用它:

var method = function(number) {
  this.number = number;

  this.add = function(param) {
    this.number = this.number + param;
    return this
  }
  
  this.multiply = function(param) {
    this.number = this.number * param;
    return this
  }
  
  this.valueOf = function() {
    return this.number;
  }
}

var num = new method(2)
  .add(3)
  .multiply(7);
console.log(num.valueOf());
console.log(num + 3);
console.log(num + " bottles on the wall");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多