【问题标题】:How do I use the same method when chaining over an object?链接对象时如何使用相同的方法?
【发布时间】:2011-11-23 18:53:55
【问题描述】:
var string = function (base) { 
  return { 
    add: function (added) {
      return base + added;
  }
 }
}

text = string("robots").add(" are awesome");

console.log(text);

// robots are awesome

text2 = string("robots").add(" are awesome").add(" everytime!");

console.log(text2);

// TypeError: Object robots are awesome has no method 'add'

我该如何进行这项工作?您可以做些什么来在函数范围内的某些对象之间共享“添加”方法?

【问题讨论】:

  • 您通过使用称为级联的概念在链中使用相同的方法。看我的回答。

标签: javascript method-chaining


【解决方案1】:

如果你只返回string(base + added)。它不会正常工作。当你console.log 时它会返回一个对象。

var string = function (base) { 
  return { 
    add: function (added) {
      return string(base + added);
  }
 }
}
console.log(string("test ").add("this ").add("thing"));
// outputs [object Object]

以上示例无法满足您的要求。你可以试试这个:

var string = function (base) { 
  return { 
    add: function (added) {
      base += added;
      return string(this.toString());
    },
   toString: function() {
      return base;
    }
 }
}

console.log(string("test ").add("this ").add("thing").toString());
// outputs "test this thing"

这会正确输出。

您也可以扩展 String.prototype 并添加 add 方法。

【讨论】:

  • 谢谢。我正在考虑扩展字符串作为修复,但我听说在核心对象上进行原型设计很糟糕?在我的情况下无论如何都可以这样做吗?
  • 有两种思路。一个说不好,一个说没问题。我认为你必须寻找每一个的优缺点并自己选择
【解决方案2】:

这可以是achieved,具有功能继承和级联。这就是 OP 的目的。没有伪经典继承。

var string = function (someStartString) {
    var that = {
        append: function (newString) {
              that.currentString += newString;
              return that;//enable cascades        
        }
        ,currentString: someStartString
     };
     return that;
}

示例调用

var textObj = string("robots").append(" are awesome");

console.log(textObj.currentString);//output: robots are awesome

// robots are awesome

var text2Obj = string("robots").append(" are awesome").append(" everytime!");

console.log(text2Obj.currentString);//output: robots are awesome everytime!

【讨论】:

    【解决方案3】:

    您想从您的 add 函数返回一个 string

    var string = function (base) { 
      return { 
        add: function (added) {
          return string(base + added);
      }
     }
    }
    

    【讨论】:

      【解决方案4】:

      您返回的是纯字符串,而不是构造函数的实例。在纯字符串上,.add 不可用。

      您可以通过返回一个新实例来解决这个问题,以便.add 函数在结果中可用:

      return string( base + added );
      

      然后它基本上是这样的:

      string("robots").add(" are awesome").add("everytime!");
      string("robots are awesome").add("everytime!");
      string("robots are awesomeeverytime!");
      

      代替:

      string("robots").add(" are awesome").add("everytime!");
      "robots are awesome".add("everytime!");
      <error>
      

      【讨论】:

        【解决方案5】:

        你可以这样做:

        var string = function (base) { 
          return { 
            add: function (added) {
              return string(base + added);
            },
            toString: function() {
              return base;
            }
         }
        }
        

        编辑:您可能还想添加一个toString 方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-02-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-18
          • 1970-01-01
          • 2018-01-17
          相关资源
          最近更新 更多