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

如果您拒绝此建议,您可以随时使用 重命名文件 意图操作重命名该文件。 另一个意图操作会建议将该类移动到具有相应名称的新文件中。 建议名称的格式由 代码风格:JavaScript 页面上的 文件命名约定 列表中所选样式决定。

如果您刚创建了一个新文件,但在其中开始输入类或接口时又想到了更好的名称,这将非常有用。 要调用意图操作,请将插入符放在相关类的名称处,然后按 Alt+Enter。
重命名函数、变量和参数

函数、变量和参数的 重命名 重构可能会就地执行,但您可以按 Shift+F6 在 重命名 对话框中配置重构范围。
要默认打开 重命名 对话框,请打开 设置 对话框(Ctrl+Alt+S ),转到 ,并在 指定重构选项 区域中选择 在模态对话框中 选项。

在编辑器中,将插入符放在要重命名的函数、变量或参数处,或选择它,然后按 Shift+F6 ,或从上下文菜单中选择 。
如果 PyCharm 检测到该符号在注释或字符串中的用法,请指定是否也要重命名这些用法。
在带有画布的字段中,输入函数、变量或参数的新名称。
或者:
再次按 Shift+F6 以打开 重命名 对话框。
选中 在注释和字符串中搜索 和 搜索文本出现位置 复选框,以重命名注释、字符串文本和文本中的该符号的用法。
默认情况下,将在整个项目中重命名该符号。 您可以在列表中选择其他 作用域。
重命名常量
在编辑器中,将插入符放在要重命名的常量处,或选择该常量,然后按 Shift+F6 ,或从上下文菜单中选择 。
在打开的 重命名 对话框中,输入常量的新名称。
可选:
选中 在注释和字符串中搜索 和 搜索文本出现位置 复选框,以重命名注释、字符串文本和文本中的该常量的用法。
默认情况下,将在整个项目中重命名该常量。 您可以在列表中选择其他 作用域。
重命名符号的动态用法
由于 JavaScript 的动态特性,在某些情况下,动态引用是有效用法,应该进行重命名。 然而,通常情况下,重命名动态用法并非预期行为。 在下面的示例中,在 rename.test() 中将 test() 更改为 test1() 是正确的,而在 hello.test() 中则会出错。
因此,在应用复杂重构之前,PyCharm 始终会显示 预览 窗口。

提取重构
PyCharm 提供多种 提取 重构,可用于引入参数、变量、常量、字段、方法和函数。 要运行其中任一重构,请选择要重构的表达式,然后选择 。 您可以选择整个表达式,或将插入符放在表达式中的任意位置,PyCharm 将帮助您进行选择。
引入参数
使用 引入参数 重构,将函数调用中的表达式替换为参数。 PyCharm 将相应更新该函数的声明及其调用。 新参数的默认值可以在函数体内初始化,或通过函数调用进行传递。
假设在函数 calculate_sum(i) 中有一段包含硬编码 1 的代码。 使用引入参数重构,您可以将这个硬编码的 1 替换为 i2 参数。 新的 i2 参数可以提取为 可选 或 必需。
示例 1:引入可选参数
将新参数 i2 提取为可选参数。 新参数在 calculate_sum(i) 的函数体内进行初始化,且 show_sum() 中对 calculate_sum(i) 的调用不变。
参阅 选择参数类型(可选) 下文。
示例 2:引入必需参数
将新参数 i2 提取为必需参数, show_sum() 中对 calculate_sum(i) 的调用也随之更改。
参阅 选择参数类型(必需) 下文。
引入参数
在编辑器中,将插入符放在您要转换为参数的表达式内,并按 Ctrl+Alt+P ,或从上下文菜单中选择 重构 | 引入参数。
或者,执行以下任一操作:
按 Ctrl+Alt+Shift+T 并选择 。
转到 。
如果在当前插入符位置检测到多个表达式,请在 表达式 列表中选择所需的一个。

如果找到所选表达式的多处出现位置,请在 找到多个出现 列表中选择 仅替换此处出现 或 替换所有出现。

最后,将显示用于配置重构的弹出窗口。

选中 生成 JSDoc 以生成 JSDoc 注释块。 如果您需要指定自定义的默认参数值,这可能会很有帮助。
选择新参数的类型(optional 或 required ),并在适用时指定其默认值:
如果选中 可选参数 复选框,则会在函数体内使用默认值初始化该参数。
如果清除 可选参数 复选框,将通过现有的函数调用传递默认参数值。 所有函数调用都会根据新的函数签名进行更改,并在函数体中添加参数初始化。
最初,PyCharm 会将调用重构的位置处的表达式作为默认值。 在大多数情况下,您无需更改它。 如仍有必要,请在 JSDoc 注释中按
@param <parameter name> - <default value>格式指定其他默认值。通过在列表中双击接受建议的参数名,或在带红色画布的字段中指定自定义名称。 准备就绪后,按 Enter。

另请注意,在 ES6 代码中,将应用新的默认函数参数语法
function calculate_sum(i, i2 = 1),而非i2 = i2 || 1;。 在 https://developer.mozilla.org 网站 了解有关默认函数参数的更多信息。
选择重构模式
您可以直接在编辑器中(就地模式) as described above 引入参数,或使用 引入参数对话框。 这两种方式非常相似,不同之处如下:
在对话框中,您可以点击 预览 ,并在 查找 工具窗口的专用选项卡中查看预期更改。 在就地模式下,此功能不可用。
在对话框中,PyCharm 会在 值 字段中建议默认参数值,您可以接受建议或指定其他值。 在就地模式下,PyCharm 会将调用重构的位置处的表达式视为默认参数值。 如需指定其他值,您必须使用 JSDoc 注释块。
默认情况下,PyCharm 运行 引入参数 重构的就地模式。 要使用 提取参数 对话框,请打开 设置 对话框(Ctrl+Alt+S ),转到 编辑器 | 代码编辑 ,并在 重构 区域中选择 在模态对话框中 选项。
引入变量
使用 引入变量 重构,将表达式替换为 函数作用域变量(var) 或 块作用域变量(let)。 此重构可使您的源代码更易于阅读和维护。
假设您有一个函数,其 return 语句中包含部分硬编码的表达式:
使用引入变量重构,您可以将 '(' + this.getValue() + ')' 表达式替换为一个变量,例如 string。 提取变量的作用域取决于其声明所使用的语句 var 或 let ,以及新变量声明所在的上下文(在函数内或函数外)。
示例 1:引入块作用域变量并使用 let 语句进行声明
变量 string 是从 return 语句中的 '(' + this.getValue() + ')' 表达式中提取的。 新变量使用 let 语句在 Parenizor.method('toString', function ()) 内进行声明。
示例 2:引入变量并在任意函数外进行声明
变量 appName 是从 navigator.appName 表达式中提取的,并使用 var 语句在任意函数外部进行声明。
引入变量
在编辑器中,选择要转换为变量的表达式,然后按 Ctrl+Alt+V ,或从上下文菜单中选择 。
或者,执行以下任一操作:
按 Ctrl+Alt+Shift+T 并选择 。
转到 。
如果在当前插入符位置检测到多个表达式,请在 表达式 列表中选择所需的一个。

如果找到所选表达式的多处出现位置,请在 找到多个出现 列表中选择 仅替换此处出现 或 替换所有出现。

最后,将显示用于配置重构的弹出窗口。
从列表中选择用于声明新变量的语句:

通过在列表中双击接受建议的参数名,或在带红色画布的字段中指定自定义名称。 准备就绪后,按 Enter。
选择重构模式
您可以直接在编辑器中(就地模式) as described above 或使用 提取变量对话框。 默认情况下,PyCharm 运行 引入变量 重构的就地模式。 要使用 提取变量 对话框,请打开 设置 对话框(Ctrl+Alt+S ),转到 编辑器 | 代码编辑 ,并在 重构 区域中选择 在模态对话框中 选项。
引入常量
使用 引入常量 重构,将表达式替换为 常量。 此重构可使您的源代码更易于阅读和维护。 它还可帮助您避免使用没有关于其值或用途的任何说明的硬编码常量。
在类中,您可以引入只读字段;如果有多个适用的作用域,则可以选择作用域。 在其他上下文中,PyCharm 仅引入局部常量。
示例 1:选择引入常量的作用域
假设您有一个类 AccountingDepartment ,其方法 printName() 中硬编码了 "Department name :"。
PyCharm 可以将新的常量作为局部常量引入,并在 printName() 函数内声明,或者作为全局或模块常量引入,并在类外声明。

"

示例 2:在不选择作用域的情况下引入常量
如果从任意类外调用引入常量重构,PyCharm 会自动引入一个局部变量,并在当前函数或代码块内声明它。

引入常量
在编辑器中,选择要转换为常量的表达式,然后按 Ctrl+Alt+C ,或从上下文菜单中选择 。
或者,执行以下任一操作:
按 Ctrl+Alt+Shift+T 并选择 。
转到 。

如果在当前插入符位置检测到多个表达式,请在 表达式 列表中选择所需的一个。

如果在类中调用引入常量重构,请引入只读字段或选择新常量的作用域,参阅 示例 1。

对于全局常量,可能会找到所选表达式的多处出现位置。 请在 找到多个出现 列表中选择 仅替换此处出现 或 替换所有出现。

通过在列表中双击接受建议的参数名,或在带红色画布的字段中指定自定义名称。 准备就绪后,按 Enter。

引入字段
引入字段 重构会声明一个新字段,并使用所选表达式对其进行初始化。 原始表达式会被替换为对该字段的使用。
在下面的示例中,引入的是同一个字段 _calcArea。 这些示例展示了三种不同的方式来初始化引入的字段。
示例 1:引入的字段在封闭方法中初始化
示例 2:提取的字段在其声明中初始化
示例 3:提取的字段在类的构造函数中初始化
引入字段
选择重构模式
默认情况下,PyCharm 运行 引入字段 重构的就地模式, as described above。
要在重构时使用提取字段对话框,请打开 设置 对话框(Ctrl+Alt+S ),转到 编辑器 | 代码编辑 ,并在 重构 区域中选择 在模态对话框中 选项。
提取方法
提取方法重构允许您使用提取的代码创建一个命名的方法或函数。 调用 提取方法 重构时,PyCharm 会检测作为所选代码片段输入的变量以及作为其输出的变量。 检测到的输出变量将作为提取的方法或函数的返回值。
在下面的示例中,从 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() 函数内。 选择了 function MyFunction 作为目标作用域。
提取函数
在编辑器中,选择要转换为函数的代码片段,然后按 Ctrl+Alt+M ,或从上下文菜单中选择 。
或者,执行以下任一操作:
按 Ctrl+Alt+Shift+T 并选择 。
转到 。
如果所选表达式位于函数内,请在列表中选择目标作用域:
如果您选择 global ,提取的函数将会在任意函数外声明。 参阅 Example 1 上文。
要在当前封闭函数内定义提取的函数,请选择 function <current enclosing function name>。 参阅 Example 3 上文。

要打开具有更多选项的提取方法对话框,请再次按 Ctrl+Alt+M。 在此对话框中,您可以选择是通过生成的 函数声明 来声明提取的函数,或 在表达式内 声明。 参阅 Examples above 上文。

默认情况下打开提取函数对话框
打开 设置 对话框(Ctrl+Alt+S ),转到 编辑器 | 代码编辑 ,并在 重构 区域中选择 在模态对话框中 选项。
提取超类
提取超类 重构会基于当前类的成员创建一个新的抽象类。 创建的类会被自动继承。
假设您有一个类 AccountingDepartment ,并且您预计其中的 printName() 方法将被重复使用。
您可以提取一个超类 Department ,并将 printName 和 Name 字段包含在其中。
提取超类
将插入符放在要提取超类的类中的任意位置。
从主菜单中选择 ,或从上下文菜单中选择 。 将打开 提取超类 对话框。
指定新超类的名称,并选中要包含在其中的类成员旁边的复选框。 可选:标记您希望设为抽象的成员。
在 目标文件 字段中,指定新类所在文件的位置。 默认情况下,该字段会显示调用重构的位置处当前文件的路径。
选择 提取超类。 PyCharm 会创建一个新类,并使用
extends标记源类。要创建一个超类,并将方法参数中对源类的引用替换为对超类的引用,请选择 提取超类,并在可能的地方使用。 PyCharm 会在 查找 工具窗口的 重构预览 窗格中显示建议的更改。
引入对象或数组解构
解构让您可以轻松地从数组和对象中提取值并将其赋给变量。 该功能具有非常简洁的语法,在您需要在应用程序中传递数据时经常使用。 有关更多信息,参阅 Exploring ES6。
在 PyCharm 中,您可以使用意图操作 Alt+Enter 调用解构。 使用 替换为对象/数组解构 操作时,将移除原始赋值。 要保留该赋值,请使用 引入对象/数组解构。
替换原始赋值
将插入符放在数组或对象中的某个值处,然后按 Alt+Enter。
从列表中选择 替换为对象解构 或 替换为数组解构。

如果数组或对象中的某些值未使用,将跳过这些元素:

保留原始赋值
将插入符放在数组或对象中的某个值处,然后按 Alt+Enter。
从列表中选择 引入对象解构 或 引入数组解构。

该意图操作在处理 React 类组件时非常方便:

为函数生成解构参数
将插入符放在函数的参数处,然后按 Alt+Enter。
从列表中选择 将参数转换为对象。
提取 Vue 组件
提取 Vue 组件 重构可让您在无需任何复制和粘贴的情况下,从现有组件中提取新的 Vue.js 组件。 注意,此重构仅以就地方式工作,因此请确保在 编辑器 | 代码编辑 设置页面  Ctrl+Alt+S 上选择了 在编辑器中 重构选项。
提取 Vue.js 组件
选择要提取的代码片段,并从其上下文菜单中选择 ,或从主菜单中选择 。
或者,使用专用的意图操作:选择要提取的模板片段,按 Alt+Enter ,然后在列表中选择 提取 Vue 组件。 有关更多信息,参阅 Vue.js。
输入新组件的名称。 如果此名称已被使用或无效,PyCharm 会显示警告。 否则,将创建一个新的单文件组件并将其导入到父组件中。
内联重构
内联重构与 提取重构 相反。
示例 1:内联变量
内联变量 重构会将变量或常量的冗余用法替换为其初始值。 此类型的重构仅适用于块作用域变量和函数作用域变量。
示例 2:内联函数
内联方法/内联函数 重构会将方法体或函数体放入其调用方中;方法/函数本身将被删除。
在下面的示例中, Sum() 的主体被放入 Multiplication() 和 Division() 的主体中。
运行内联重构
在编辑器中,将插入符放在要内联的符号处,然后按 Ctrl+Alt+N ,或从上下文菜单或主菜单中选择 。
在与所选符号对应的 内联 对话框中,确认内联重构。
更改签名重构
使用 Change Signature 重构来更改函数名称、添加、删除、重新排序和重命名参数,并沿调用层次结构传播新参数。
您还可以使用 引入参数 重构添加参数。
下面的示例展示了运行更改签名重构的不同方式。 在所有情况下,函数 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 中,选择参数并点击
。 将打开 选择要传播新参数的方法 对话框。 左侧窗格显示函数调用的层次结构。 当您选择一个函数时,右侧窗格会在 调用方方法 和 被调用方法 字段中分别显示所选函数的代码及其调用的函数的代码。参阅 Example 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语句。
