1

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

fn(s);

fn.subfn(s);

例如制作这样的工具

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;
    }
  }
}

但是每次我调用字符串时,我都在重新定义空白 fn,性能可能很差,代码也很差,或者我错了?

谢谢。

4

3 回答 3

1

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

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);

这与您在开始时展示的示例不同。

于 2013-08-26T12:44:07.527 回答
0

您可以尝试这样的事情(未经测试):

function string(s) {
  if(s) return typeof(s) === "string";
}

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

但是,您可能会遇到使用“字符串”作为函数名称的问题,因为它可能与现有的 String 对象发生冲突。

于 2013-08-26T12:47:34.110 回答
0

您可以创建一个 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/

于 2013-08-26T12:51:17.820 回答