带有附加子函数的函数调用

Function call with additional sub functions

本文关键字:函数调用 子函数      更新时间:2023-09-26

我在问自己,是否可以在js中调用一个函数,同时在里面有额外的子函数

fn(s);
fn.subfn(s);

例如,制作类似的utils

var s = "123";
string(s) // true
string.blank(s) // false

我认为可能是这样的:

function string(s) {
  if(s) return typeof(s) === "string";
  return {
    blank: function(s) {
      return s.trim().length === 0;
    }
  }
}

但每次调用string时,我都会重新定义blank-fn,可能会有糟糕的性能和糟糕的代码,或者我错了?

谢谢。

函数只是对象,所以是的,您可以只向它们添加属性:

function string(s) {
  return typeof(s) === "string";
}
string.blank = function(s) {
    return s.trim().length === 0;
}

这将允许您拨打

string(s);
string.blank(s);

正如您的示例所示。


对代码的评论:

当您调用string时,您定义的函数返回一个对象,因此您需要将该函数调用为

string().blank(s);

这与你一开始展示的例子不同。

您可以创建一个Thing()类并实例化"Thing"对象,以防止重新定义函数。(Thing()而不是string()以防止任何类型的冲突。)

function Thing(s) {
    return {
        isString: function() {
            return typeof(s) === "string";
        },
        isBlank: function() {
            return s.trim().length === 0;
        }  
    };
}
var t = new Thing("123");
t.isString() // true
t.isBlank() // false

http://jsfiddle.net/KKrsa/

你可以尝试这样的东西(未经测试):

function string(s) {
  if(s) return typeof(s) === "string";
}
string.blank = function(s) {
  return s.trim().length === 0;
}

不过,使用"string"作为函数名称可能会遇到问题,因为它可能与现有的string对象冲突。