JS:怎么做function.function(param).function?

时间:2014-07-04 05:40:58

标签: javascript node.js

感谢阅读。

所以我正在开发我的第一个node.js应用程序。我对javascript比较熟悉但不够好。

我已经使用名为FOO的方法声明了一个类bars(index, value},它接受​​了2个参数。为了使用它,在创建实例后,我有以下fooInstance.bars(3, 2)

我想把这种方法称为有点不同。如何更改我的FOO定义,以便我可以像fooInstance.bars(3).value一样使用它?

我目前的代码在

之下
var util = require('util'),
  events = require('events');

var FOO = function(opts) {
  this.ipAddress = opts.ipAddress;
  this.port = opts.port;
};

FOO.prototype = new events.EventEmitter;
module.exports = FOO;

FOO.prototype.bars = function (index, value) {
  switch(index) {
    case 1:  
      console.log("Apple " + " at " + value)
      break;
    case 2:
      console.log("Banana, " + " at " + value)
      break;
    case 3: 
      console.log("Cherry, " + " at " + value)
      break;
    case 4:
      console.log("Date, " + " at " + value)
      break;
    default:
      break;
  }
}

提前感谢!

4 个答案:

答案 0 :(得分:5)

它被称为Method Chaining或有时Fluent interface。 '链接背后的主要思想是作为结果返回object(通常是self),允许直接调用返回的值。

我从here复制了一个示例代码(属性转到原作者),返回self作为返回值。

var obj = {
        function1: function () {
            alert("function1");
            return obj;
        },
        function2: function () {
            alert("function2");
            return obj;
        },
        function3: function () {
            alert("function3");
            return obj;
        }
    }


obj.function1().function2().function3();

对于FOO实施,请尝试在this功能结束时返回bars

FOO.prototype.bars = function(index,value){
  // your previous code here;
  this.value = value;
  return this;
}      

答案 1 :(得分:2)

您不是要求方法链接。更像是

> console.log(fooInstance.bars(3).value)
> Cherry

然后执行以下操作:

var util = require('util'),
  events = require('events');

var FOO = function(opts) {
  this.ipAddress = opts.ipAddress;
  this.port = opts.port;
};

FOO.prototype = new events.EventEmitter;
module.exports = FOO;

FOO.prototype.bars = function (index) {
  var undef;
  switch(index) {
    case 1:  
      return { value : 'Apple' };
    case 2:
      return { value : 'Bannana' };
    case 3: 
      return { value : 'Cherry' };
    case 4:
      return { value : 'Date' };
    default:
      return { value : undef };
  }
}   

我不确定你是否想要一个字符串作为一个值而只是猜测。这将返回一个对象作为答案,然后可以像“.value”一样使用。

我对案例陈述的处理方式更简单:

var easierThanCase = {
  '1' : 'Apple',
  '2' : 'Bannana',
  '3' : 'Cherry',
  '4' : 'Date'
};

return { value : easierThanCase[index+''] };

答案 2 :(得分:1)

您有两种可能性:

  1. 您只需传递所需的参数即可。 Javascript将设置不用于undefined的参数。然后,在该函数中,您可以通过if (!value)if (typedef value === "undefined")进行检查以查找状态。 (这里的Javascript通常非常灵活。你也可以获得你传递的参数,但是你没有在函数定义中声明。)

  2. 即使名称已被使用,您也可以创建新功能bars()。但这样做会破坏旧功能。

  3. 为了检查1,请尝试:

    var test = new FOO();
    console.log(test.bars(3));
    

    它会回复:Cherry, at undefined

    为了检查2,在定义条形后添加:

    FOO.prototype.bars = function(index) {
        console.log("In new bars!");
    }
    

    以下是更多信息,关于关键字argumentsHow to get function parameter names/values dynamically from javascript

答案 3 :(得分:0)

这是实现bars方法的更好方法:

FOO.prototype.bars = function (index, value) {
    var fruitArray = ["Apple", "Banana", "Cherry", "Data"];
    console.log(fruitArray[index - 1] + " at " + value);
}

如果您想要这样做:fooInstance.bars(3).value。您正在使用一个参数调用条形图(索引=== 3),然后在此结果上调用value属性。在这个例子中,这个逻辑没有多大意义。希望这会有所帮助。