链接对象时如何使用相同的方法?

时间:2011-11-23 18:53:56

标签: javascript method-chaining

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'

如何使这项工作?如何在函数范围内的某些对象之间共享方法“添加”?

5 个答案:

答案 0 :(得分:2)

如果您只返回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方法。

答案 1 :(得分:1)

这可以是具有功能继承和级联的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!

答案 2 :(得分:0)

您想从string函数返回add

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

答案 3 :(得分:0)

您可以执行以下操作:

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

修改:您可能还想添加toString方法。

答案 4 :(得分:0)

您将返回一个纯字符串,而不是构造函数的实例。在普通字符串上,.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>