Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.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 为什么在这里使用解构?_Javascript_Destructuring - Fatal编程技术网

Javascript 为什么在这里使用解构?

Javascript 为什么在这里使用解构?,javascript,destructuring,Javascript,Destructuring,我在Odin项目上问了这个问题,我在那里遇到了它,并被引导去研究解构,我做到了。我理解正在发生的事情,但我不知道为什么会这样做。只需使用原始变量名而不使用反结构大括号,就可以得到相同的结果(请参阅我的jfiddle链接,其中我删除了反结构并得到了相同的结果)。当我被要求使用更多的代码、输入和复杂性来达到同样的效果时,我发现很难学到一些东西。在const Person中使用return{sayName}和在const Nerd中使用const{sayName}=Person(name)有什么好处?

我在Odin项目上问了这个问题,我在那里遇到了它,并被引导去研究解构,我做到了。我理解正在发生的事情,但我不知道为什么会这样做。只需使用原始变量名而不使用反结构大括号,就可以得到相同的结果(请参阅我的jfiddle链接,其中我删除了反结构并得到了相同的结果)。当我被要求使用更多的代码、输入和复杂性来达到同样的效果时,我发现很难学到一些东西。在const Person中使用
return{sayName}
和在const Nerd中使用
const{sayName}=Person(name)
有什么好处?我在jfiddle中使用了
return-sayName
const-sayName
,得到了相同的结果

原始代码:

const Person = (name) => {
  const sayName = () => console.log(`my name is ${name}`)
  return {sayName}
}

const Nerd = (name) => {
  // simply create a person and pull out the sayName function with destructuring assignment syntax!
  const {sayName} = Person(name)
  const doSomethingNerdy = () => console.log('nerd stuff')
  return {sayName, doSomethingNerdy}
}

const jeff = Nerd('jeff')

jeff.sayName() //my name is jeff
jeff.doSomethingNerdy() // nerd stuff


普遍的共识是,这是一个不好的解构示例,但我已经做得太深了,仍将尝试理解它

通过使用解构,可以向
Person
添加其他函数

例如,人需要跳跃:

const Person = (name) => {
  const sayName = () => console.log(`my name is ${name}`)

  const jump = () => console.log('I jumped') // new feature

  return {sayName, jump} // jump can inserted into the object here and used externally
}

然后,正如评论中所指出的,把人变成书呆子的更好方法是:

const Nerd = (name) => {
  // simply create a person and pull out the sayName function with destructuring assignment syntax!
  const doSomethingNerdy = () => console.log('nerd stuff')
  return {...Person(name) , doSomethingNerdy}
}

最后,Nerd可以被解构,Person和Nerd内部的所有功能都可以使用


我想这就是他们想要达到的目的。

“奥丁项目”似乎是一个教学网站。我不确定这里有多少人(如果有的话)熟悉他们的课程。我最好的猜测是,他们现在想介绍这个概念,这样他们就可以在以后的教材中建立这个概念。但我真的不能说。不确定是否有人可以。当你为一些简单的事情使用一个强大的功能,如解构,它通常掩盖了该功能的有用性。当你继续在应该使用它的地方使用它时,它会变得非常有意义,这看起来像是继承。你可以有
Person
s,你可以有
Nerd
s,每个人都有
sayName()
函数,但只有Nerd才有
dosomethinnerdy()
函数。。。虽然这也是一种非常奇怪的继承方式。我想这应该是一个解构的例子,但在作者的头脑中看起来更好。你说得对,这里没有意义。有很多很好的解构用例,但这不是其中之一。在原始代码中,这是一个不好的示例。您最好不要使用解构,因为您只返回一个函数。这也是我所能想到的。问题是,他们从未将此作为理由。以下课程不在此代码块上展开。感谢您的评论“通过使用destructuring,可以向Person添加额外的函数”,无需为了获得相同的行为而进行destructure。你展示的只是创建一个对象文字-除了语法与镜像的语法相似之外,基本上与解构赋值没有关系。第1行,你不向Person添加额外的函数。“
Nerd
然后可以解构
Person
,并使用
sayName
jump
”它也不能这样做,而是返回
{…Person(name),doSomethingNerdy}
,而不分解任何内容。
const Nerd = (name) => {
  // simply create a person and pull out the sayName function with destructuring assignment syntax!
  const doSomethingNerdy = () => console.log('nerd stuff')
  return {...Person(name) , doSomethingNerdy}
}