详解AndroidStudio中代码重构菜单Refactor功能

代码重构几乎是每个程序员在软件开发中必须要不断去做的事情,以此来不断提高代码的质量。Android Stido(以下简称AS)以其强大的功能,成为当下Android开发工程师最受欢迎的开发工具,也是Android官方推荐使用的工具。如此优秀的工具,自然少不了要在代码重构这件事情上好好表现一把了。本文将通过代码演示,功能截图来详细介绍AS为代码重构提供的各项功能。

在AS的主菜单栏中有一项“Refactor”下拉菜单,点击该下拉菜单,会看到如下的界面,菜单中的每一项,都是为代码重构提供的一项自动实现功能。这么多的功能项,可见AS在代码重构功能上的强大,下面我们对这些功能项一一进行介绍。另外,还可以在编辑界面中点击右键,在弹出的菜单中也可以找到“Refactor”。

1、Refactor This

作用:重构当前。操作此项,会显示对当前光标选中处可行的重构方法。

示例:选择了类名“RefactorTest”,操作“Refactor This”后,显示了可执行的重构方法列表,可以通过选择数字来执行对应的方法。

2、Rename

作用:对光标选中项进行重命名。不仅可以对类中的成员变量进行重命名,还能对文件名,包名等进行重命名,Module中与之相关联的所有地方都会一起修改,而不用一一手动修改。

快捷键:Shift + F6

示例:在红框中输入修改后的名称,并按Enter键即可。

3、Rename File

作用:修改当前编辑界面显示的文件的文件名。就相当于鼠标选中该文件,并执行“Rename”方法。

示例:在显示的对话框中输入新文件名。可以在下方的选项框中选择修改范围,引用该文件的地方,注释,字符串中都可以选择一起修改。

4、Change Signature

作用:修改方法、类、构造函数的签名,其实就是修改所选项的一些属性。

快捷键:Ctr l+ F6

示例:如下展示了一个方法重构前,重构过程,以及重构后的情形(以修改一个方法签名为例)。

重构前:

 private void testChangeSignature(int first, int second) {
 }

选中方法名后,执行该重构方法后,会弹出如下对话框,可以对该方法各种属性进行修改,添加/删除参数,调整参数顺序,新增/删除异常等。

重构后:

 public void testChangeSignature(int second, int first, String third) throws NullPointerException {
}

5、Type Migration

作用:类型迁移,即对变量数据类型,或者方法的返回类型进行修改。前面介绍了对文件名,包名,变量名等进行修改,这里对类型进行修改。

快捷键:Ctrl + Shift + F6

重构前:

 private int age = 10;
 public RefactorTest(int age) {
 this.age = age;
 }

选中要修改的类型,执行该重构方法,会弹出对话框,根据需要编辑类型,选中作用范围即可。指定范围内,与该变量相关联处都会被修改。

重构后(由于从int修改到String,所以还需要手动修改变量值):

private String age = "10";
 public RefactorTest(String age) {
 this.age = age;
 }

6、Make Static

作用:给内部类或者方法添加static关键字。示例比较简单,就不做演示了。

7、Convert To Instance Method

作用: 转换为实例方法,即将静态方法去掉static关键字。

8、Move

功能:移动文件到指定路径

快捷键:F6

9、Copy

作用:在指定包中拷贝一份当前文件

快捷键:F5

10、Safe Detele

作用:安全删除,可用于对方法/字段等进行快速删除,会删除掉与之相关联的引用。

快捷键:Alt + Delete

11、Extract

(1)Variable

作用:提取变量。这一点在碰到比较长的表达式时经常用到,将看起来很长很复杂的表达式提取出来作为一个变量表示。

快捷键:Ctrl + Alt + V

重构前:我们常会看到这样的代码

public void testExtractVariable() {
 Log.i("demo", "age=" + getAaaaaaaaaaaaaaaaaaaaaaaaaaaAge() + ";name=" + getNnnnnnnnnnnnnnnnnnnnnnname());
 }
 private int getAaaaaaaaaaaaaaaaaaaaaaaaaaaAge() {
 return age;
 }
 private String getNnnnnnnnnnnnnnnnnnnnnnname() {
 return name;
 }

第二行的要打印的信息表达式太长了,希望单独提取出来用一个变量表示。本示例中鼠标停留在第2行“getAaaaaaaaaaaaaaaaaaaaaaaaaaaAge”处,执行该重构方法,会弹出如下红框部分对话框,显示的是选中表达式相关的可提取部分,根据需要选择要提取的部分即可。

重构后:

public void testExtractVariable() {
 String msg = "age=" + getAaaaaaaaaaaaaaaaaaaaaaaaaaaAge() + ";name=" + getNnnnnnnnnnnnnnnnnnnnnnname();
 Log.i("demo", msg);
}
private int getAaaaaaaaaaaaaaaaaaaaaaaaaaaAge() {
 return age;
}
private String getNnnnnnnnnnnnnnnnnnnnnnname() {
 return name;
}

(2)Constant

作用:提取常量,将表达式中的值提取为常量。

快捷键:Ctrl + Alt +C

重构前:

public void testExtractConstant() {
 String filename = "sdcard";
 }

重构后:

 public static final String SDCARD = "sdcard";
 public void testExtractConstant() {
 String filename = SDCARD;
 }

(3)Filed

作用:提取字段,将局部变量提取为全局变量。

快捷键:Ctrl + Alt +F

重构前:

public void testExtractField() {
 String name ="zhangsan";
}

重构后:

 private final String string = "zhangsan";
 public void testExtractField() {
 }

(4)Parameter

作用:将局部变量提取为方法的参数。

快捷键:Ctrl + Alt +P

重构前:

public void testExtractParameter() {
 printName();
}
private void printName(){
 String name = "zhangsan";
 Log.i("demo","My name is:"+name);
}

重构后:

public void testExtractParameter() {
 printName("zhangsan");
}
private void printName(String name){
 Log.i("demo","My name is:"+ name);
 }

(5)Functional Parameter ( 函数式参数 )Ctrl + Alt + Shift + P

(6)Parameter Object

作用:将参数提取为一个对象。该功能主要是针对参数比较多的时候,将这些参数提取出来作为一个Bean实例传入。

重构前:

private void testExtractParamObject() {
 String info = getInfo("zhangshan", 20, 180f);
}
private String getInfo(String name, int age, float height) {
 return "name=" + name + ";age=" + age + ";height=" + height;
}

重构后:

private void testExtractParamObject() {
 String info = getInfo(new Person("zhangshan", 20, 180f));
}
private String getInfo(Person person) {
 return "name=" + person.getName() + ";age=" + person.getAge() + ";height=" + person.getHeight();
}
private static class Person {
 private final String name;
 private final int age;
 private final float height;
 private Person(String name, int age, float height) {
 this.name = name;
 this.age = age;
 this.height = height;
 }
 public String getName() {
 return name;
 }
 public int getAge() {
 return age;
 }
 public float getHeight() {
 return height;
 }
}

(7)Mehtod

作用:提取为方法

快捷键:Ctrl + Alt +M

重构前:

public void testExtractMethod() {
 List<String> nameList = new ArrayList<>();
 nameList.add("zhangshan");
 nameList.add("lisi");
 nameList.add("wangwu");
 int size = nameList.size();
}

鼠标光标选中第2~5行后执行该重构方法

重构后:

public void testExtractMethod() {
 List<String> nameList = getNameList();
 int size = nameList.size();
}
@NonNull
private List<String> getNameList() {
 List<String> nameList = new ArrayList<>();
 nameList.add("zhangshan");
 nameList.add("lisi");
 nameList.add("wangwu");
 return nameList;
}

(8)Type Parameter

(9)Method Object

作用:将该选中的内容提取为一个方法,并提取到一个独立的类中。和“Method”很类似,不同的是提取的方法最后放在哪里。

重构前:

public void testExtractMethod() {
 List<String> nameList = new ArrayList<>();
 nameList.add("zhangshan");
 nameList.add("lisi");
 nameList.add("wangwu");
 int size = nameList.size();
}

重构后:

public void testExtractMethod() {
 List<String> nameList = Utils.invoke();
 int size = nameList.size();
}
private static class Utils {
 private static List<String> invoke() {
 List<String> nameList = new ArrayList<>();
 nameList.add("zhangshan");
 nameList.add("lisi");
 nameList.add("wangwu");
 return nameList;
 }
}

(10)Delegate

作用:提取为一个代理类。

重构前:

public class RefactorTest{
 public void testExtractInterface() {
 System.out.print("testExtractInterface");
 }
}

重构后:

public class RefactorTestDelegate {
 public RefactorTestDelegate() {
 }

 public void testExtractInterface() {
 System.out.print("testExtractInterface");
 }
}

public class RefactorTest{

 private final RefactorTestDelegate refactorTestDelegate = new RefactorTestDelegate();

 public void testExtractInterface() {
 refactorTestDelegate.testExtractInterface();
 }
}

(11)Interrface

作用:提取为接口。

重构前:

public class RefactorTest {
 public void testExtractInterface() {
 System.out.print("testExtractInterface");
 }
}

public修饰的方法才可以被提取到接口中。

重构后:

interface IRefactorTest {
 void testExtractInterface();
}
public class RefactorTest implements IRefactorTest {

 @Override
 public void testExtractInterface() {
 System.out.print("testExtractInterface");
 }
}

(12)Superclass

作用:将指定内容提取到父类中。

重构前:

private void testExtractSupperclass() {
 testSuper();
}
public void testSuper() {
 System.out.print("testSuper");
}

重构后:

//=======RefactorTest extends RefactorTestBase=======
private void testExtractSupperclass() {
 testSuper();
}

class RefactorTestBase {
 public void testSuper() {
 System.out.print("testSuper");
 }
}

12、Inline

作用:转换为内联、方法链形式的调用。

快捷键:Ctrl + Alt +N

重构前:

private void testInline() {
 int a = 100;
 int b = 200;
 System.out.print(add(a, b));
}
private int add(int a, int b) {
 System.out.print("a=" + a + ";b=" + b);
 return a*2 + b*3;
}

重构后:

private void testInline() {
 int a = 100;
 int b = 200;
 System.out.print("a=" + a + ";b=" + b);
 System.out.print(a * 2 + b * 3);
 }

原先需要调用一个方法,重构后直接把该方法中的代码给复制过来了。因为上面选中的是内联所有的,并且删除该方法,所以add方法也就被删除了。

13、Find and Replace Code Duplicates

14、Invert Boolean

作用:转换Boolean值,将当前false/true的值进行转化为相反的值。

重构前:

private boolean isEmpty(String str) {
 if (str != null && str.length() == 0) {
 return false;
 }
 return true;
 }

重构后:

private boolean isNotEmpty(String str) {
 if (str != null && str.length() == 0) {
 return true;
 }
 return false;
 }

15、Pull Members Up

作用:将子类的成员上移到父类中。

重构前:

public class RefactorBase {

}
public class RafactorSub extends RefactorBase {
 int age = 10;

 public void printSub() {
 System.out.print(age);
 }
}

重构后:

public class RefactorBase {
 int age = 10;
 public void printSub() {
 System.out.print(age);
 }
}
public class RafactorSub extends RefactorBase {

}

16、Push Members Down

作用:将父类中的成员下移到子类中,正好是“Pull Members Up”的反向操作。

重构前:

public class RefactorBase {
 int age = 10;
 public void printSub() {
 System.out.print(age);
 }
}

public class RafactorSub extends RefactorBase {

}

重构后:

public class RefactorBase {

}
public class RafactorSub extends RefactorBase {
 int age = 10;
 public void printSub() {
 System.out.print(age);
 }
}

17、Use Interface Where Possible

18、Replace Inheritance with Delegation

作用:使用代理替代继承。在java中,提倡使用组合,而不是继承。

重构前:

public abstract class AbsClass {
 public abstract void print();
}

public class ClassWrapper extends AbsClass {
 @Override
 public void print() {
 System.out.print("print");
 }
}
private void testReplaceInheritanceWithDelegation() {
 new ClassWrapper().print();
}

重构后:

public abstract class AbsClass {
 public abstract void print();
}

public class ClassWrapper {
 private final ClassImpl absClass = new ClassImpl();

 public void print() {
 absClass.print();
 }

 private class ClassImpl extends AbsClass {
 @Override
 public void print() {
 System.out.print("print");
 }
 }
}

public class RefactorTest {
 private void testReplaceInheritanceWithDelegation() {
 new ClassWrapper().print();
 }
}

这一部分有点像Android中Context,ContextWrapper,ContextImpl类之间的关系。

19、Remove Middleman

作用:移除中间人,其实就是移除中间过程。

重构前:

public class RefactorTest {

 private void testRemoveMiddleMan() {
 BookManager bookManager = new BookManager();
 bookManager.addBook("java");
 }

 public static class BookManager {
 private List<String> mBookList = new ArrayList<>();

 private void addBook(String bookName) {
 mBookList.add(bookName);
 }
 }
}

重构后:

public class RefactorTest {

 private void testRemoveMiddleMan() {
 BookManager bookManager = new BookManager();
 bookManager.getmBookList().add("java");
 }

 public static class BookManager {
 private List<String> mBookList = new ArrayList<>();

 public List<String> getmBookList() {
 return mBookList;
 }
 }
}

对比重构前和重构后会发现,添加book这个动作,从由BookManager的addBook方法来执行,变成了直接有mBookList来执行了。这个addBook就是这个MiddleMan,显得多余,可以优化掉。实际上优化后就变成一个inline方式了,可以对比前面讲到的“Inline”。

20、Wrap Method Return Value

作用:封装返回值

public class RefactorTest {

 private void testWrapReturnValue() {
 String name = getName();
 }

 private String getName() {
 return "zhangsan";
 }
}

重构后:

public class RefactorTest {

 private void testWrapReturnValue() {
 String name = getName().getValue();
 }

 private Person getName() {
 return new Person("zhangsan");
 }

 public class Person {
 private final String value;

 public Person(String value) {
 this.value = value;
 }

 public String getValue() {
 return value;
 }
 }
}

21、Convert Anonymous to Inner

作用:将匿名内部类转为内部类。

重构前:

private void testConvertAnonymousToInner(){
 view.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 }
 });
}

重构后:

public class RefactorTest{

 View view;
 private void testConvertAnonymousToInner(){
 view.setOnClickListener(new MyOnClickListener());
 }

 private static class MyOnClickListener implements View.OnClickListener {
 @Override
 public void onClick(View v) {

 }
 }
}

22、Encapsulate Fields

作用:封装字段,用于生成Getter/Setter

重构前:

public String name = "zhangsan";
 private void testEncapsulateFields() {
 System.out.println(name);
 }

通过该对话框,可以选择要封装的字段,设置修饰符等。默认选择时,name字段的修饰符从public变成了private,这也就避免了外部类通过实例直接访问它。

重构后:

private String name = "zhangsan";
private void testEncapsulateFields() {
 System.out.println(getName());
}
public String getName() {
 return name;
}
public void setName(String name) {
 this.name = name;
}

23、Replace Temp With Query

24、Replace Constructor with Factory Method

作用:将构造方法替换为工厂方法

重构前:

public class MyClass {
 private String title;
 private String message;
 private String sure;
 private String cancel;
 public MyClass(String title, String message, String sure, String cancel) {
 this.title = title;
 this.message = message;
 this.sure = sure;
 this.cancel = cancel;
 }
}
public class RefactorTest {
 private void testReplaceConstructorWithFactory(Context context) {
 MyClass myClass = new MyClass("title", "message", "sure", "cancle");
 }
}

重构后:

public class MyClass {

 private String title;
 private String message;
 private String sure;
 private String cancel;

 private MyClass(String title, String message, String sure, String cancel) {
 this.title = title;
 this.message = message;
 this.sure = sure;
 this.cancel = cancel;
 }

 public static MyClass createMyClass(String title, String message, String sure, String cancel) {
 return new MyClass(title, message, sure, cancel);
 }
}

public class RefactorTest {
 private void testReplaceConstructorWithFactory(Context context) {
 MyClass myClass = MyClass.createMyClass("title", "message", "sure", "cancle");
 }
}

原先public修饰的构造函数,已经变成private了,MyClass类只能通过工厂方法来获取实例,而无法再直接new了。

25、Replace Constructor with Builder

作用:将构造方法替换为Builder方式

重构前:

public class RefactorTest{
 private void testReplaceConstructorWithBuilder(Context context){
 MyDialog dialog = new MyDialog(context,"title","message","sure","cancle");
 }
}

public class MyDialog extends Dialog {
 private String title;
 private String message;
 private String sure;
 private String cancel;
 public MyDialog(@NonNull Context context) {
 super(context);
 }
 public MyDialog(Context context, String title, String message, String sure, String cancel) {
 super(context);
 this.title = title;
 this.message = message;
 this.sure = sure;
 this.cancel = cancel;
 }
}

重构后:

public class RefactorTest {
 private void testReplaceConstructorWithBuilder(Context context) {
 MyDialog dialog = new MyDialogBuilder()
  .setContext(context)
  .setTitle("title")
  .setMessage("message")
  .setSure("sure")
  .setCancel("cancle")
  .createMyDialog();
 }
}

public class MyDialogBuilder {
 private Context context;
 private String title;
 private String message;
 private String sure;
 private String cancel;

 public MyDialogBuilder setContext(Context context) {
 this.context = context;
 return this;
 }

 public MyDialogBuilder setTitle(String title) {
 this.title = title;
 return this;
 }

 public MyDialogBuilder setMessage(String message) {
 this.message = message;
 return this;
 }

 public MyDialogBuilder setSure(String sure) {
 this.sure = sure;
 return this;
 }

 public MyDialogBuilder setCancel(String cancel) {
 this.cancel = cancel;
 return this;
 }

 public MyDialog createMyDialog() {
 return new MyDialog(context);
 }
}

看到这里,我们应该能够联想到AlertDialog类中的Builder了。将构造函数的形式,转变为了建造者模式的形式,这样不会拘泥于构造函数的参数个数,参数类型的限制,从而灵活设置属性。

26、Generify

作用:泛型重构,自动添加泛型的参数。

重构前:

private void testGenerify() {
 List list = new ArrayList();
 list.add("one");
 list.add("two");
 list.add("three");
 }

重构后:

 private void testGenerify() {
 List<String> list = new ArrayList<String>();
 list.add("one");
 list.add("two");
 list.add("three");
}

27、Migrate

28、Internationalize(国际化)

29、Remove Unused Resources

作用:一直不用的资源

示例:下图中1.jpg是一个没有被应用的文件。

在执行该重构方法后,1.jpg就被删除了。

总结

以上所述是小编给大家介绍的AndroidStudio中代码重构菜单Refactor功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • Android Studio使用ViewPager+Fragment实现滑动菜单Tab效果

    本文为大家分享了Android Studio实现滑动菜单Tab效果的具体代码,供大家参考,具体内容如下 描述: 之前有做过一个记账本APP,拿来练手的,做的很简单,是用Eclipse开发的: 最近想把这个APP重新完善一下,添加了一些新的功能,并选用Android Studio来开发: APP已经完善了一部分,现在就想把已经做好的功能整理一下,记录下来. 效果图: 可以手动滑动菜单 也可以通过点击头部菜单进行切换 具体实现的代码: 前台代码(activity_main.xml): <?xml v

  • Android Studio Menu选择菜单的建立方法

    1.在res上面右键->New->Android resource directory 2.点击之后,出现下图Resource type选择menu,名字随便起,点击ok 3.可以看到菜单栏已经出现了men 4.menu上面右击,如下图选择: 5.file name自己随便起,点击ok 6.可以看到menu文件夹下,有一个main.XML文件,main是我起的文件名 Android Studio_Menu选择菜单的建立 1.由于手机屏幕不像电脑屏幕那样有充足的空间来添加各种选项,由此需要建立一

  • 详解AndroidStudio中代码重构菜单Refactor功能

    代码重构几乎是每个程序员在软件开发中必须要不断去做的事情,以此来不断提高代码的质量.Android Stido(以下简称AS)以其强大的功能,成为当下Android开发工程师最受欢迎的开发工具,也是Android官方推荐使用的工具.如此优秀的工具,自然少不了要在代码重构这件事情上好好表现一把了.本文将通过代码演示,功能截图来详细介绍AS为代码重构提供的各项功能. 在AS的主菜单栏中有一项"Refactor"下拉菜单,点击该下拉菜单,会看到如下的界面,菜单中的每一项,都是为代码重构提供的

  • 详解SpringBoot中使用RabbitMQ的RPC功能

    一.RabbitMQ的RPC简介 实际业务中,有的时候我们还需要等待消费者返回结果给我们,或者是说我们需要消费者上的一个功能.一个方法或是一个接口返回给我们相应的值,而往往大型的系统软件,生产者跟消费者之间都是相互独立的两个系统,部署在两个不同的电脑上,不能通过直接对象.方法的形式获取想要的结果,这时候我们就需要用到RPC(Remote Procedure Call)远程过程调用方式. RabbitMQ实现RPC的方式很简单,生产者发送一条带有标签(消息ID(correlation_id)+回调

  • Java中自定义异常详解及实例代码

    Java中自定义异常详解及实例代码 下面做了归纳总结,欢迎批评指正 自定义异常 class ChushulingException extends Exception { public ChushulingException(String msg) { super(msg); } } class ChushufuException extends Exception { public ChushufuException(String msg) { super(msg); } } 自定义异常 En

  • 微信小程序中实现一对多发消息详解及实例代码

    微信小程序中实现一对多发消息详解及实例代码 微信小程序中各个界面之间的传值和通知比较蛋疼.所以模仿了iOS中的通知中心,在微信小程序中写了一套类似的通知中心. 通知中心可以做到:1对多发消息,传递object.使用十分简洁. 使用时,在需要接收消息的界面注册一个通知名.然后在需要发消息的界面post这个通知名就可以了.可以在多个界面注册同一个通知名.这样就可以1对多发消息. 使用方法: 1:在app.js中引用notification.js var notificationCenter = re

  • 详解java中的四种代码块

    在java中用{}括起来的称为代码块,代码块可分为以下四种: 一.简介 1.普通代码块: 类中方法的方法体 2.构造代码块: 构造块会在创建对象时被调用,每次创建时都会被调用,优先于类构造函数执行. 3.静态代码块: 用static{}包裹起来的代码片段,只会执行一次.静态代码块优先于构造块执行. 4.同步代码块: 使用synchronized(){}包裹起来的代码块,在多线程环境下,对共享数据的读写操作是需要互斥进行的,否则会导致数据的不一致性.同步代码块需要写在方法中. 二.静态代码块和构造

  • 详解vue中使用transition和animation的实例代码

    以前写页面注重在功能上,对于transition和animation是只闻其声,不见其人,对于页面动画效果心理一直痒痒的.最近做活动页面,要求页面比较酷炫,终于有机会认真了解了. transition:英文过渡的意思,作用是过渡效果:animation:英文活泼.生气.激励,动画片就是animation film,作用是动画效果. transition在w3school的实例: //将鼠标悬停在一个 div 元素上,逐步改变表格的宽度从 100px 到 300px: div { width:10

  • 详解Python中@staticmethod和@classmethod区别及使用示例代码

    本文主要介绍Python中,class(类)的装饰器@staticmethod和@classmethod的使用示例代码和它们的区别. 1.@staticmethod和@classmethod区别 @staticmethod:静态方法 @classmethod:类方法 一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法. 而使用@staticmethod或@classmethod,就可以不需要实例化,直接通过类名就可以实现调用 使用:直接类名.方法名()来调用.@staticmethod

  • Java中的Static class详解及实例代码

     Java中的Static class详解 Java中的类可以是static吗?答案是可以.在Java中我们可以有静态实例变量.静态方法.静态块.类也可以是静态的. java允许我们在一个类里面定义静态类.比如内部类(nested class).把nested class封闭起来的类叫外部类.在java中,我们不能用static修饰顶级类(top level class).只有内部类可以为static. 静态内部类和非静态内部类之间到底有什么不同呢?下面是两者间主要的不同. (1)内部静态类不需

  • 详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数

    hasattr()函数 hasattr()函数用于判断是否包含对应的属性 语法: hasattr(object,name) 参数: object--对象 name--字符串,属性名 返回值: 如果对象有该属性返回True,否则返回False 示例: class People: country='China' def __init__(self,name): self.name=name def people_info(self): print('%s is xxx' %(self.name))

  • 详解Javascript 中的 class、构造函数、工厂函数

    到了ES6时代,我们创建对象的手段又增加了,在不同的场景下我们可以选择不同的方法来建立.现在就主要有三种方法来构建对象,class关键字,构造函数,工厂函数.他们都是创建对象的手段,但是却又有不同的地方,平时开发时,也需要针对这不同来选择. 首先我们来看一下,这三种方法是怎样的 // class 关键字,ES6新特性 class ClassCar { drive () { console.log('Vroom!'); } } const car1 = new ClassCar(); consol

随机推荐