重构 JavaScript
重构是指在不改变应用行为的情况下更新源代码。 重构可帮助您保持代码稳健、 干净且易于维护。
移动符号重构
除了 移动文件和文件夹之外,GoLand 还允许您移动 JavaScript 顶级符号。 移动符号重构适用于 ES6 模块中的类、函数和变量。
移动类、函数或变量
选择要移动的符号。
按 F6 ,或从上下文菜单或主菜单中选择 。 或者,选择 或按下 Ctrl+Alt+Shift+T ,然后从列表中选择 。
将打开 移动模块成员 对话框。
指定目标文件并选择要移动的成员。
默认情况下,GoLand 会自动将成员的可见性提升到所需级别。 如果您希望保持可见性级别不变,请在 可见性 中点击 保持不变。
上移类成员重构
向上拉取类成员重构会将类方法上移至类层次结构中的超类。
示例:将类方法移动到超类
假设您有一个类 AccountingDepartment ,它扩展自抽象类 Department。 在本示例中, 向上拉取类成员重构会将 printMeeting() 方法从 AccountingDepartment 移动到其超类 Department。
将类的方法移至超类
将插入符定位在您希望向上拉取成员的类内任意位置。
从主菜单或上下文菜单中选择 。 将打开 上移成员 对话框。
从列表中选择希望移动方法的超类。
要将方法上移,请在 待上移的成员 列表中选中其旁边的复选框。
重命名重构
除了 重命名文件和文件夹之外,在任意语言环境中都可用,您也可以重命名类、方法、函数、变量和参数。 GoLand 会更改符号在声明中的名称,并默认更改其在当前项目中的所有用法。
重命名类及其方法
在编辑器中,将插入符放置或选择要重命名的类或方法,然后按 Shift+F6 ,或从上下文菜单中选择 。
在打开的 重命名 对话框中,输入类或方法的新名称。
可选:
选中 在注释和字符串中搜索 和 搜索文本出现位置 复选框,以修改注释、字符串文字和文本中的类或方法用法。
默认情况下,将在整个项目中重命名该类或方法。 您可以从列表中选择其他 范围。
保持类及包含文件名称一致
当您重命名类时,如果文件名与类名相同,GoLand 也会建议重命名该文件。 如果您接受建议,GoLand 会更新其他文件中的 import 语句中此文件的名称。

如果您拒绝此建议,稍后可以随时通过 重命名文件 意图操作重命名该文件。 另一项意图操作会建议将类移动到具有相应名称的新文件中。 建议名称的格式由 文件名约定 列表中选定的样式在 代码样式:JavaScript页面上确定。
如果您刚创建了新文件,但在开始编写类或接口时想出了更好的名称,这将非常有用。 要调用意图操作,将插入符置于相关类名称上并按 Alt+Enter。
重命名函数、变量和参数
函数、变量和参数的 重命名重构可能会在原地执行,您也可以按 Shift+F6 ,以便在 重命名 对话框中配置重构的范围。
要默认打开 重命名 对话框,请打开 设置 对话框(Ctrl+Alt+S ),转到 ,然后在 指定重构选项 区域中选择 在模态对话框中 选项。

在编辑器中,将插入符放置或选择要重命名的函数、变量或参数,然后按 Shift+F6 ,或从上下文菜单中选择 。
如果 GoLand 检测到注释或字符串中存在符号的用法,请指定是否也要重命名这些用法。
在画布字段中,输入函数、变量或参数的新名称。
或者:
再次按 Shift+F6 打开 重命名 对话框。
选中 在注释和字符串中搜索 和 搜索文本出现位置 复选框,以修改注释、字符串文字和文本中的符号用法。
By default, the symbol is renamed in the entire project. 您可以从列表中选择其他 范围。
重命名常量
在编辑器中,将插入符号放在常量上或选中要重命名的常量,然后按 Shift+F6 ,或从上下文菜单中选择 。
在打开的 重命名 对话框中,键入常量的新名称。
可选:
选择 在注释和字符串中搜索 和 搜索文本出现位置 复选框,以便在注释、字符串文本和文本中重命名常量的用法。
By default, the constant is renamed in the entire project. 您可以从列表中选择其他 范围。
重命名符号的动态用法
由于 JavaScript 的动态特性,有些情况下动态引用是有效用法,应执行重命名。 然而,重命名动态用法通常不是预期的行为。 在以下示例中,将 test() 更改为 test1() 在 rename.test() 中是正确的,但在 hello.test() 中则会导致错误。
因此,在应用复杂重构之前,GoLand 始终会显示 预览 窗口。
提取重构
GoLand 提供多种 Extract 重构操作,以引入参数、变量、常量、字段、方法和函数。 要运行任一重构操作,请选中要重构的表达式并选择 。 您可以选中整个表达式,或将插入符号置于表达式中任意位置,GoLand 将协助您完成选择。
引入参数
使用 Introduce Parameter 重构操作,可用参数替换函数调用中的表达式。 GoLand 将相应更新函数的声明及调用。 新参数的默认值可在函数体内初始化或通过函数调用传递。
假设您在函数 calculate_sum(i) 中有一段包含硬编码 1 的代码。 使用 Introduce Parameter 重构,可将该硬编码的 1 替换为 i2 参数。 新参数 i2 可提取为 可选参数 或 必需参数。
示例 1:引入可选参数
新参数 i2 被提取为可选参数。 新参数在 calculate_sum(i) 的函数体中初始化,且 calculate_sum(i) 在 show_sum() 中的调用未发生变化。
请参阅下文中的 选择参数类型(可选)。
示例 2:引入必需参数
新参数 i2 被提取为必需参数,并相应更改了 calculate_sum(i) 在 show_sum() 中的调用。
请参阅下文中的 选择参数类型(必需)。
引入参数
在编辑器中,将插入符号置于要转换为参数的表达式中,然后按 Ctrl+Alt+P ,或从上下文菜单中选择 重构 | 引入参数。
或者,执行下列操作之一:
按 Ctrl+Alt+Shift+T ,然后选择 。
转到 。
如果当前插入符号位置检测到多个表达式,请从 表达式 列表中选择所需表达式。
如果找到所选表达式的多个实例,请从 发现多个位置 列表中选择 仅替换此处 或 替换所有位置。
最后,将显示用于配置重构的弹出窗口。
选中 生成 JSDoc 可生成 JSDoc 注释块。 如果需要指定自定义默认参数值,此功能可能会很有帮助。
选择新参数的类型(可选 或 必需 ),并在适用时指定其默认值:
如果选中了 可选参数 复选框,则将在函数体中使用默认值初始化该参数。
请参阅上方的 Introduce Parameter 示例 1。
如果清除了 可选参数 复选框,默认参数值将通过现有函数调用传递。 所有函数调用将根据新的函数签名进行更改,并会在函数体中添加参数初始化。
请参阅上方的 Introduce Parameter 示例 2。
最初,GoLand 将在调用重构操作的表达式作为默认值接受。 在大多数情况下,您无需更改此默认值。 如仍需更改,请在 JSDoc 注释中以格式
@param <参数名称> - <默认值>指定新的默认值。通过在列表中双击接受建议的参数名之一,或在红色画布字段中指定自定义名称。 准备就绪后,请按 Enter。
还请注意,在 ES6 代码中,将应用新的默认函数参数语法
function calculate_sum(i, i2 = 1),而不会使用i2 = i2 || 1;。 从 https://developer.mozilla.org 网站了解有关默认函数参数的更多信息。
选择重构模式
您可以直接在编辑器中(以原位模式) 如上所述提取参数,也可以使用 引入参数对话框。 这两种方法相当相似,其区别如下:
在对话框中,您可以单击 预览 ,并在 查找 工具窗口的专用选项卡中查看预期更改。 在原位模式下,此功能不可用。
在对话框中,GoLand 会在 值 字段中建议默认参数值,您可以接受建议或指定其他值。 在原位模式下,GoLand 会将调用重构的位置上的表达式视为默认参数值。 如需指定其他值,必须使用 JSDoc 注释块。
默认情况下,GoLand 以原位模式运行 Introduce Parameter 重构。 要使用 提取参数 对话框,请打开 设置 对话框(Ctrl+Alt+S ),转到 编辑器 | 代码编辑 ,并在 重构 区域中选择 在模态对话框中 选项。
引入变量
使用 Introduce Variable 重构将表达式替换为 函数作用域变量(var)或 块级作用域变量(let)。 此重构可使源代码更易于阅读和维护。
假设您有一个函数,其中某个表达式在 return 语句中为部分硬编码:
通过 Introduce Variable 重构,您可以将 '(' + this.getValue() + ')' 表达式替换为变量,例如 string。 提取变量的作用域取决于声明时使用的语句 var 或 let 以及新变量声明时的上下文(在函数内部或外部)。
示例 1:使用 let 语句声明引入的块级作用域变量
变量 string 是从 '(' + this.getValue() + ')' 表达式中提取的,该表达式位于 return 语句中。 新变量通过 let 语句在 Parenizor.method('toString', function ()) 中声明。
示例 2:引入变量并在函数外部声明
变量 appName 是从 navigator.appName 表达式中提取的,并使用 var 语句在任何函数之外进行声明。
引入变量
在编辑器中,选中要转换为变量的表达式并按 Ctrl+Alt+V ,或从上下文菜单中选择 。
或者,执行以下操作之一:
按 Ctrl+Alt+Shift+T 并选择 。
转到 。
如果在当前位置检测到多个表达式,请从 表达式 列表中选择所需表达式。
如果找到多个所选表达式的出现位置,请从 发现多个位置 列表中选择 仅替换此处 或 替换所有位置。
最后,会显示用于配置重构的弹出窗口。
从列表中选择用于新变量声明的语句:
通过双击列表中的建议参数名之一来接受,或在红色画布字段中指定自定义名称。 准备就绪后按 Enter。
选择重构模式
您可以直接在编辑器中(以原位模式) 如上所述提取变量,也可以使用 提取变量对话框。 默认情况下,GoLand 以原位模式运行 Introduce Variable 重构。 要使用 提取变量 对话框,请打开 设置 对话框(Ctrl+Alt+S ),转到 编辑器 | 代码编辑 ,并在 重构 区域中选择 在模态对话框中 选项。
引入常量
使用 Introduce Constant 重构将表达式替换为 常量。 此重构可使源代码更易于阅读和维护。 它还可以帮助您避免使用硬编码常量,同时没有对其值或用途进行说明。
在类中,您可以引入只读字段,或者在有多个合适作用域时选择其中一个。 在其他上下文中,GoLand 仅引入局部常量。
示例 1:为引入的常量选择作用域
假设您有一个类 AccountingDepartment ,其中方法 printName() 中的 "Department name :" 是硬编码的。
GoLand 可以将新常量引入为局部常量,并在 printName() 函数内部声明,或将其作为全局或模块常量,在类的外部声明。

"
示例 2:引入常量但不选择作用域
如果从类外部调用 Introduce Constant 重构,GoLand 将自动引入一个局部变量,并在当前函数或代码块中声明。
引入常量
在编辑器中,选择要转换为常量的表达式,然后按 Ctrl+Alt+C ,或从上下文菜单中选择 。
或者,执行以下操作之一:
按 Ctrl+Alt+Shift+T 并选择 。
转到 。
如果在当前光标位置检测到多个表达式,请从 表达式 列表中选择所需表达式。
如果从类内部调用重构操作,请引入只读字段或选择新常量的作用域,参见 示例 1。
对于全局常量,可以找到所选表达式的多个出现位置。 从 发现多处重复 列表中选择 仅替换此项 或 替换所有项。
通过双击列表中的建议参数名称接受其中之一,或在红色背景字段中指定自定义名称。 准备就绪后按 Enter。
引入字段
Introduce Field 重构会声明一个新字段,并使用所选表达式进行初始化。 原始表达式将被该字段的使用替换。
在以下示例中,引入了相同的字段 _calcArea。 这些示例展示了初始化引入字段的三种不同方式。
示例 1:在封闭方法中初始化引入字段
示例 2:在字段声明中初始化提取字段
示例 3:在类的构造函数中初始化提取字段
引入字段
选择重构模式
默认情况下,GoLand 会直接在编辑器中运行 Introduce Field 重构(即原地模式), 如上所述。
如需在重构时使用 Extract Field 对话框,请打开 设置 对话框(Ctrl+Alt+S ),转到 编辑器 | 代码编辑 ,并在 重构 区域中选择 在模态对话框中 选项。
提取方法
Extract Method 重构允许使用提取的代码创建一个命名方法或函数。 当调用 Extract Method 重构时,GoLand 会检测所选代码片段的输入变量以及其输出变量。 检测到的输出变量将作为提取方法或函数的返回值使用。
在以下示例中,从 c = a + b; 表达式中提取了一个函数。
示例 1:从另一个函数内部的表达式中提取全局作用域函数
执行重构操作的 c = a + b; 表达式位于 MyFunction() 函数内部。 选择了 global 目标作用域。
示例 1.1:生成函数声明
示例 1.2:在表达式内部声明提取的函数
示例 2:从不在任何函数中的表达式中提取全局作用域函数
执行重构操作的 c = a + b; 表达式不在任何函数中。 因此,无法选择目标作用域。
示例 2.1:生成函数声明
示例 2.2:在表达式内部声明提取的函数
示例 3:提取一个在封闭函数内部定义的函数
执行重构操作的 c = a + b; 表达式位于 MyFunction() 函数内部。 选择了 函数 MyFunction 目标作用域。
提取函数
在编辑器中,选择要转换为函数的代码片段,然后按 Ctrl+Alt+M 或从上下文菜单中选择 。
或者,执行以下操作之一:
按 Ctrl+Alt+Shift+T 并选择 。
转到 。
如果所选表达式位于函数内部,请从列表中选择目标作用域:
要打开包含更多选项的 Extract Method 对话框,请再次按下 Ctrl+Alt+M。 在此对话框中,您可以选择将提取出的函数通过生成的 function declaration 声明,或者 以内联表达式 的形式声明。 请参见上方的 示例。
默认打开“提取函数”对话框
打开 设置 对话框(Ctrl+Alt+S ),转到 编辑器 | 代码编辑 ,并在 重构 区域中选择 在模态对话框中 选项。
提取超类
Extract Superclass 重构会基于当前类的成员创建一个新的抽象类。 创建的类会自动进行扩展。
假设您有一个类 AccountingDepartment ,并预期其中的 printName() 方法将被重复使用。
您可以提取一个超类 Department ,并将 printName 与 名称 字段包含在其中。
提取超类
将插入符号置于您希望从中提取超类的类内任意位置。
从主菜单中选择 ,或者从上下文菜单中选择 。 将打开 提取超类 对话框。
指定新超类的名称,并选中要包含在其中的类成员对应的复选框。 可选:标记要设为抽象的成员。
在 目标文件 字段中,指定新类所在文件的位置。 默认情况下,该字段显示调用重构时的当前文件路径。
选择 提取超类。 GoLand 会创建一个新类,并使用
extends标记源类。要创建一个超类,并在方法的参数中用该超类替换对源类的引用,请选择 提取超类并在可能处使用。 GoLand 会在 查找 工具窗口的 重构预览 面板中显示建议的变更。
引入对象或数组解构
解构可让您轻松地将数组和对象中的值解包到变量中。 此功能具有非常简洁的语法,在需要在应用程序中传递数据时经常使用。 有关详情,请参见 Exploring ES6。
在 GoLand 中,您可以使用意图操作 Alt+Enter 来调用解构。 使用 Replace with object/array destructuring 操作时,原始赋值将被移除。 若要保留赋值,请使用 Introduce object/array destructuring。
替换原始赋值
将插入符号置于数组或对象中的某个值上并按下 Alt+Enter。
从列表中选择 使用对象解构替换 或 替换为数组解构。
如果未使用数组或对象中的某些值,这些元素将被跳过:
保留原始赋值
将插入符号置于数组或对象中的某个值上并按下 Alt+Enter。
从列表中选择 引入对象解构 或 引入数组解构。
在使用 React 类组件时,此意图操作非常实用:
为函数生成解构参数
将插入符号置于函数参数上并按下 Alt+Enter。
从列表中选择 将参数转换为对象。
提取 Vue 组件
使用 Extract Vue Component 重构可从现有组件中提取新的 Vue.js 组件,无需复制和粘贴。 请注意,此重构仅支持就地操作,请确保在 编辑器 | 代码编辑 设置页面中已选中 在编辑器中 重构选项 Ctrl+Alt+S。
提取 Vue.js 组件
选择要提取的代码片段,并从其上下文菜单中选择 ,或从主菜单中选择 。
或者,使用专用意图操作:选择要提取的模板片段,按下 Alt+Enter ,然后从列表中选择 提取 Vue 组件。
输入新组件的名称。 如果该名称已被使用或无效,GoLand 会显示警告。 否则,将创建一个新的单文件组件并导入到父组件中。
内联重构
Inline 重构与 Extract 重构 相对。
示例 1:内联变量
Inline Variable 重构将冗余的变量或常量用其初始值替代。此重构类型仅适用于块作用域和函数作用域的变量。 此类型的重构仅适用于块级作用域和函数级作用域的变量。
示例 2:内联函数
内联方法/ 内联函数重构会将方法或函数的主体放入其调用者的代码中,并删除该方法/函数本身。
在下方示例中, Sum() 的主体被放入 Multiplication() 和 Division() 的主体中。
运行内联重构
在编辑器中,将插入符号置于要内联的符号上,然后按 Ctrl+Alt+N ,或从上下文菜单或主菜单中选择 。
更改签名重构
使用 更改签名重构来更改函数名称,添加、删除、重新排序或重命名参数,并在调用层级中传播新参数。
您也可以使用 引入参数重构来添加参数。
以下示例展示了运行更改签名重构的不同方式。 在所有情况下,函数 result() 被重命名为 generate_result() ,并向该函数添加了一个新参数 input。 示例展示了根据重构设置,函数调用、调用该函数的函数 show_result() 以及其他代码片段可能受到的影响。
示例 1:重命名函数、添加参数并通过函数调用传递该参数
在此示例中,函数 result() 被重命名为 generate_result() ,添加了参数 input ,并在函数调用中传递了值 100 作为参数。
示例 2:重命名函数并添加默认参数
在此示例中,函数 result() 被重命名为 generate_result()。 添加了一个默认参数 input ,其值为 100。 新参数在 generate_result() 中以 ES6 语言级别格式 function generate_result(input = 100) {} 或 ES5 格式 input = input || 100 进行初始化。
示例 3:重命名函数、添加默认参数并将该参数传播到函数调用中
在此示例中,函数 result() 被重命名为 generate_result()。 添加了一个默认参数 input ,其值为 100。 新参数在 generate_result() 中以 ES6 语言级别格式 function generate_result(input = 100) {} 或 ES5 格式 input = input || 100 进行初始化。 input 参数通过调用函数 show_result() 进行传播,因此相应地更改了函数调用。
调用更改签名
在编辑器中,将插入符号放在要重构的函数名称上,然后按 Ctrl+F6 ,或从上下文菜单或主菜单中选择 重构 | 更改签名。 将打开 更改签名 对话框。
重命名函数
在 更改签名 对话框 Ctrl+F6 中,编辑 名称 字段。
管理函数参数
沿调用层级传播参数
在 更改签名 对话框 Ctrl+F6 中,选择参数并点击
。 将打开 选择要传播新参数的方法 对话框。 左侧窗格显示函数调用的层级结构。 选择函数后,右侧窗格将分别在 调用方方法 和 被调用方方法 字段中显示该函数的代码及其调用的函数的代码。请参阅上文中的 示例 3。
在左侧窗格中,选中要传播参数的函数旁的复选框,然后单击 确定。
预览更改并完成重构
将默认导出转换为命名导出
对类、函数、常量变量、字符串、对象和类型,您可以将 export default 语句替换为具名的 export 语句,并相应地更新对应的 import 语句。
如果符号已重新导出,则会同步更新对应的 export 语句。
可以从 export default 和 import 语句中调用此重构操作。
将光标置于
export default语句处或导出的名称上,按 Alt+Enter ,然后选择 将默认导出转换为具名导出。 要切换预览,请按 Ctrl+Q。
在
import语句中,将光标置于导入项的名称处,按 Alt+Enter ,然后选择 将默认导出转换为具名导出。 预览窗口(Ctrl+Q )会显示import语句的更新方式。
将命名导出转换为默认导出
对类、函数、常量变量、字符串、对象和类型,您可以将具名的 export 语句替换为 export default 语句,并相应地更新对应的 import 语句。
可以从 export default 和 import 语句中调用此重构操作。
在
export语句中,将光标置于导出项的名称上,按 Alt+Enter ,然后选择 将具名导出转换为默认导出。 要切换预览,请按 Ctrl+Q。
在
import语句中,将光标置于导入项的名称处,按 Alt+Enter ,然后选择 将具名导出转换为默认导出。 预览窗口(Ctrl+Q )会显示import语句的更新方式。
