Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何设置JS对象';属性既可以调用函数又可以是嵌套哈希?_Javascript_Ecmascript 6 - Fatal编程技术网

Javascript 如何设置JS对象';属性既可以调用函数又可以是嵌套哈希?

Javascript 如何设置JS对象';属性既可以调用函数又可以是嵌套哈希?,javascript,ecmascript-6,Javascript,Ecmascript 6,有点奇怪。我对Azure中的上下文对象很感兴趣,尽管我还没有找到它的完整源代码 在Azure函数应用程序中使用它时,您可以同时执行context.log和context.log.error。我正试图在本地模拟中复制这一点,如下所示: let context = { log(message){ console.log(message) }, log: { info: console.log, error: console.error } } 但是很明显,

有点奇怪。我对Azure中的
上下文
对象很感兴趣,尽管我还没有找到它的完整源代码

在Azure函数应用程序中使用它时,您可以同时执行
context.log
context.log.error
。我正试图在本地模拟中复制这一点,如下所示:

let context = {
  log(message){
    console.log(message)
  },

  log: {
    info: console.log,
    error: console.error
  }
}
但是很明显,第二个
log
属性重写了该函数,因此我不能同时执行context.log和context.log.error

我也试过了

let context = {
  'log': console.log,
  'log.error': console.error
}
但是在这里,
context.log.error
是未定义的,但是
context['log.error']
可以工作

最终,我找到了一个有效的方法:


let context = {
  'log': console.log,
}
context.log['error'] = console.error
context.log['info'] = console.log
它能满足我的需求:

context.log('message') // prints 'message'
context.log.error('message') // prints error 'message'

但我想理解为什么最后一点起作用,另外,我如何能够一次性声明所有内容,而不是依赖于
上下文。log[error]=value

您想要创建一个函数对象,然后为其分配属性。您可以使用
对象在对象文本中执行此操作。分配

 {
    log: Object.assign(function log() { /*...*/ }, {
       error() { /*...*/ },
    }),
 }

在js中,函数是对象。换句话说,
函数f(){};f、 myProperty=0
是有效的。为了避免陷阱,需要补充一点:下面的答案已经将内容封装在一个新函数中。这是因为在您的上一个版本中,在分配任务之后,例如
console.log.error===console.error
,您正在向本机API渗透,这通常是不受欢迎的。这是意料之中的,因为你在函数本身上赋值,但我最好还是提一下。哦,这是一个很好的发现,是的。为了确保这一点,我为context.log分配了一个本机函数(console.log),然后通过
context.log['error']=
向其添加了一个属性。这就是为什么下面的答案是创建一个新函数来传递这些属性,对吗?美好的非常感谢。迷人的!我明白了,因为函数在JS中是对象,所以实际上可以为它们分配属性,而这样做的一种方法就是使用Object.assign?确切地说。这也是你的第三个版本有效的原因。上面这个评论+@asdfgerte的解释很好地回答了这个问题。我还发现了这个stackoverflow问题,它进一步扩展了这个问题: