(1)①定义:类可以看做是对象的模板,用一个类可以创建出许多不同的对象
②基本用法:
calss 类名 {} 没有分号,类名首字母大写,内容写在花括号里面。实例化执行构造方法,所以必须有构造方法constructor ,但可以不写出来。在构造方法constructor 中定义属性,在构造方法constructor外面定义方法。
③class与构造函数的区别:
Class在语法上更加贴合面向对象的写法,实现继承更加易读、易理解,更易于写java等后端语言的程序员使用,本质上还是语法糖,使用prototype;用typeof检测都是function类型。
④静态方法和静态属性:
静态方法也就是class类的方法,this指向类本身,在方法前面添加static关键字,就是静态方法,不加static关键字的是实例方法。
静态属性就是使用静态方法return一个属性。
(2)私有属性和方法:
一般情况下类的属性和方法是公开的。公有的属性和方法可以被外界更改,造成意想不到的错误。所以需要私有属性和方法。
外部不能访问的属性和方法,只想在内部使用,不想暴露出去,而且公开属性容易受到外部修改影响内部。语法上没有私有属性的写法。所以只能模拟私有属性和方法。
1)、私有属性和方法下划线开头表示私有。 (不成文规定)
2)、将私有属性和方法移出类。其实就是将其放在外部作用域,当局部变量使用(前提不是全局作用域下)。然后通过闭包访问该属性。但对封装有破坏性,但没啥问题。
(3)继承
1)、class 可以通过extends关键字继承父类的所有属性和方法。
2)、子类构造函数中使用super关键字调用父类的构造函数,this操作不能放在super前面。
3)、在子类中可以通过设置与父类同名的属性或方法覆盖父类的属性或方法。
(4)总结super的不同用法
super,可以作为函数调用,也可以作为对象使用。
作为函数调用,只能用在子类的构造方法中(调用父类的构造方法),用在其他地方会报错。super虽然代表了父类的构造方法,但是内部的this指向的是子类的实例。
作为对象使用,在构造方法中使用或一般方法中,super代表父类的原型对象prototype。可以通过super调用父类的方法。定义在父类实例上的方法和属性是无法通过super使用的。通过super调用父类的方法时,方法内部的this指向当前的子类实例。在静态方法中使用,super代表父类,而不是父类原型对象。通过super调用父类的方法时,方法内部的this指向当前的子类,而不是子类实例。
(5)注意事项:
使用super的时候必须显式指定式作为函数还是对象使用,否则会报错。
super作为函数调用时,代表父类的构造函数,super中的this指向的是子类的this;非静态方法中,指向父类的原型对象;在静态方法中,指向父类
子类继承父类时,可以不写super
当子类继承父类时,如果不需要通过constructor设置属性和继承父类constructor中的属性,那么就可以不写constructor和super,否则,就必须写上constructor和super。