将对象声明为函数但具有子函数

时间:2018-04-05 00:33:14

标签: javascript object javascript-objects

要弄清楚如何将对象声明为可调用函数并不难:

const Sys = {
  log: function() {
    //do whatever
  }
}

然后使用Sys.log();

调用它

但是,在添加新的子功能时,我将如何维护此功能?

基本上,我希望能够拨打Sys.log.clear()之类的内容,同时仍然可以拨打Sys.log()

我得到的最接近的是这个,但它显然不起作用或我不会在这里问¯_(ツ)_ /¯任何帮助都表示赞赏。提前致谢

const Sys = {
  log: {
    function(arg) {
      alert(arg);
    },
    clear: function(arg) {
      alert(arg);
    }
 }
}

fiddle

1 个答案:

答案 0 :(得分:2)

我可能错了,但我认为在对象文字中干净利落地做这件事很难。您可以定义一个返回所需函数的函数:

function makelog() {
    let fn = function(arg){
        console.log(arg)
    }
    fn.clear = function(arg){
        console.log(arg)
    }
    return fn
}

const sys = {
    log: makelog()
}

sys.log("hello")
sys.log.clear("world")

这与:

大致相同

const sys = {
  log: function(arg) {
    console.log(arg)
  }
}
sys.log.clear = function(arg) {
  console.log(arg)
}

sys.log("hello")
sys.log.clear("world")

如果你可以使用getter,你也可以这样做:

const sys = {
    get log() {
            let fn = function(arg){
                console.log("from log: ", arg)
            }
            fn.clear = function(arg){
                console.log("from clear: ", arg)
            }
            return fn
        }
    }

sys.log("foo")
sys.log.clear("bar")

您还可以从允许更传统链接的函数返回您的对象,但是您需要调用这两个函数:

const sys = {
    log: function(arg) {
            if (arg !== undefined) console.log(arg);
            return this
        },
    clear: function(arg) {
        console.log(arg);
    }
 
  }

sys.log("hello").clear("world")
sys.log("just log")
sys.log().clear("just clear")