【基础认知】
1、构造器中的this指向——类的实例对象
2、类中的构造器不是必须写的,要对实例进行一些初始化的操作,如添加指定属性时才写。
3、如果A类继承了B类,且A类中写了构造器,那么A类构造器中的super时必须要调用的。
4、类中锁定的方法,都是放在了类的原型对象上,供实例去使用
class类的基础使用
(静态属性,只能构造函数访问)
(公有属性,写在构造函数.prototype)
(实例属性,定义在实例对象this上的属性)
// 手机// 实例成员只能通过实例化对象来访问// function Phone(brand, price) {// this.brand = brand// this.price = price// }// 添加方法// Phone.prototype.call = function () {// console.log('我可以打电话!!')// }// 实例化对象// let Huawei = new Phone('华为', 5999);// Huawei.call();// console.log(Huawei);class Phone {// 构造方法 名字不能修改constructor(brand, prive) {this.brand = brand;this.price = prive;}// 方法必须使用该语法,不能使用ES5的对象完整形式call() {console.log('我可以打电话!!!')}}let onePlus = new Phone('1+', 1999)onePlus.call()console.log(onePlus)
class静态成员
function Phone() {}// 静态成员,属于类不属于实例对象// 静态成员只能通过构造函数来访问Phone.name = '手机'Phone.change = function () {console.log('我可以改变世界')}Phone.prototype.size = '5.5inch'let nokia = new Phone()console.log(nokia.size)//5.5inchconsole.log(nokia.name)// undefinednokia.change()// 报错说不是一个函数class Phone1 {// 静态属性static name = '手机';static change() {console.log('我可以改变世界')}}let aaa = new Phone1();console.log(Phone1.name)//手机console.log(aaa.name)// undefined
构造函数继承
// 手机function Phone(brand, price) {this.brand = brandthis.price = price}Phone.prototype.call = function () {console.log('我可以打电话')}// 智能手机function SmartPhone(brand, price, color, size) {Phone.call(this, brand, price);this.color = colorthis.size = size}// 设置子集构造函数的原型SmartPhone.prototype = new Phone;SmartPhone.prototype.constructor = SmartPhone;// 声明子类的方法SmartPhone.prototype.photo = function () {console.log('我可以拍照')}SmartPhone.prototype.playGame = function () {console.log('我可以玩游戏')}const chuizi = new SmartPhone('锤子', 2499, '黑色', '5.5inch');console.log(chuizi)chuizi.photo()chuizi.playGame()
类的函数继承
// 手机class Phone {constructor(brand, price) {this.brand = brand;this.price = price;}call() {console.log('我可以电话')}}// 智能手机class SmartPhone extends Phone {constructor(brand, price, color, size) {//super之前调用this会报错super(brand, price);this.color = color;this.size = size;}photo() {console.log('我可以拍照')}palyGame() {console.log('我可以玩游戏')}}let chuizi = new SmartPhone('锤子', 2999, '黑色', '5.5inch')console.log(chuizi)chuizi.call()
//容易出错的地方 忘记写extends, 构造函数中的形参, super()
super 这个关键字,既可以当作函数使用,也可以当作对象使用。在这两种情况下,它的用法完全不同。
函数:
子类B的构造函数之中的super(),代表调用父类的构造函数。 super虽然代表了父类A的构造函数,但是返回的是子类B的实例,即super内部的this指的是B,因此super()在这里相当于A.prototype.constructor.call(this)。
对象:
在普通方法中,指向父类的原型对象;在静态方法中,指向父类。由于super指向父类的原型对象,所以定义在父类实例上的方法或属性,是无法通过super调用的。
class 作为构造函数的语法糖,同时有 prototype属性和__proto__属性,因此同时存在两条继承链。
类的get 和set
// get 和 setclass Phone {get price() {console.log('价格属性被读取了');return 'iloveyou'}set prive(newVal) {// 必须要设置一个参数,不然报错console.log('价格属性被修改了')}}// 实例化对象let s = new Phone();// console.log(s.price)s.prive = 'free'// 类似于vue的watch和computed