在一行中调用一些方法

时间:2014-03-26 08:14:06

标签: javascript

我用JavaScript构建了一个对象源 有没有办法像这样在一行中调用一些方法:

var x = new object("aaa").method_a().method_b().method_c();

4 个答案:

答案 0 :(得分:0)

如果你想链接函数调用,你需要从函数中返回this

function method_a(){
  // do something
  return this;
}

其他功能相同 -

然后你可以var x = new object("aaa").method_a().method_b().method_c();

答案 1 :(得分:0)

这样做的方法是让每个方法返回对象本身。例如:

function Person() {};

Person.prototype.setName=function(n){
    this.name=n;
    return this;
}

Person.prototype.setAge=function(a) {
    this.age=a;
    return this;
}

var p= new Person().setName("John").setAge(20);

显而易见的问题是,如果方法必须返回任何其他值(你可以使用setter但不能使用getter),那么你不能这样做。

答案 2 :(得分:0)

如果您的对象不支持流体接口,您始终可以将该功能包装在其上:

function FluidWrapper(obj)
{
  var o = {};

  for (var p in obj) {
    if (typeof obj[p] == 'function') {
      o[p] = function(method) {
        return function() {
          obj[method].apply(obj, [].slice.call(arguments, 0));
          return o;
        };
      }(p);
    }
  }

  return o;
}

var x = new object("aaa");
FluidWrapper(x).method_a().method_b().method_c();

Demo

答案 3 :(得分:0)

虽然穆罕默德·阿迪尔的答案是最常见的情况,但我觉得这些可能性尚未得到适当的探索。

函数返回一个值。在JavaScript中,您可以在除null和undefined之外的任何值上调用方法。这意味着这是完全可以接受的:

var x = 987654321;
var y = x.toString().split('').sort().join('0');

在这种情况下,

  • 在一个内部值为toString()的数字上调用987654321方法,并返回一个字符串。
  • 在String上调用split('')方法,其内部值为'987654321'并返回一个数组。
  • 在包含以下值的数组上调用sort()方法:['9','8','7','6','5','4','3','2','1']并返回相同的数组(但已排序)。
  • 在同一个数组上调用join('0')方法,但保持值['1','2','3','4','5','6','7','8','9']并返回一个字符串。
  • 最后,在完成所有这些操作后,y包含值'10203040506070809';

因此,链接方法作用的对象不必是相同的,只要您知道该对象的每一步都是。

如果在对象上调用了一个方法,那么该方法this内部将引用该对象。因此,如果你return this;,那么之后可以调用该对象的另一种方法。


重要的是要注意,有时您想要返回相同类型的新对象,而不是更改对象并返回它。链接时两者都同样有效,但结果不同。考虑以下jQuery示例:

var divs = $('div'); // all divs on the page
var marked = divs.filter('.marked'); // all marked divs on the page
marked.css('color', 'red'); // make marked divs red

因为filter方法返回一个新的jQuery对象,所以初始divs变量仍然包含页面上的所有div。如果过滤方法是从jQuery对象中消除它被调用并返回它,那么div将指向与标记相同的对象,因此将不再拥有页面上的所有div。 从链接的角度来看,两个潜在的实现之间没有任何变化(除了一些丢弃的对象):

$('div').filter('.marked').css('color', 'red');