1 类
类抽象了对象的公共部分,它泛指某一大类(class)
对象特指某一个,通过类实例化一个具体的对象
1.1 创建类
class Star {
constructor(name, age) {
this.name = name;
this.age = age;
}
sing(){}
dance(){}
} //创建类
var xx = new Star() //实例对象
- constructor() 方法是类的构造函数(默认方法),用于传递参数,返回实例对象,通过 new 命令生成对象实例时,自动调用该方法。如果没有显示定义, 类内部会自动给我们创建一个constructor()
- 方法之间不能加逗号分隔,同时方法不需要添加 function 关键字。
1.2 类的继承
extends关键字
class Father {
constructor(name) {
this.name = name;
}
say() {}
}
class Son extends Father {}
var son = new Son('xx');
son.name = xx;
son.say();
通过extends,Son继承了Father的属性和方法。
super关键字
class Father {
constructor(x,y) {
this.x=x;
this.y=y
}
sum() {
console.log(this.x+this.y);
}
}
class Son extends Father{ // 这样子类就继承了父类的属性和方法
constructor(x,y){
super()
}
}
var son= new Son(3,4);
son.sum(); //7
- super 关键字用于访问和调用对象父类上的函数。可以调用父类的构造函数,也可以调用父类的普通函数
- constructor 里面的this指向实例对象, 方法里面的this 指向这个方法的调用者
- 子类在构造函数中使用super, 必须放到 this 前面 (必须先调用父类的构造方法,在使用子类构造方法)
2 构造函数
2.1 构造函数简介
在 ES6之前 ,对象不是基于类创建的,而是用一种称为构建函数的特殊函数来定义对象和它们的特征。构造函数是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始值,它总与 new 一起使用。我们可以把对象中一些公共的属性和方法抽取出来,然后封装到这个函数里面。
function Father() {}
var dada = new Father();
2.2 继承
call()
fn.call(thisArg, arg1, arg2, ...)
thisArg :当前调用函数 this 的指向对象; arg1,arg2:传递的其他参数
通过call() 把父类型的 this 指向子类型的 this ,这样就可以实现子类型继承父类型的属性。
function Person(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
function Student(name, age, sex, score) {
Person.call(this, name, age, sex); // 此时父类的 this 指向子类的 this,同时调用这个函数。
this.score = score;
}
var xx = new Student('黎明', 18, '男', 100);
console.log(xx.age);//18
原型对象继承父亲方法
一般情况下,对象的方法都在构造函数的原型对象中设置,通过构造函数无法继承父类方法。
通过以下三步就可以继承父类方法:
- 将子类所共享的方法提取出来,让子类的 prototype 原型对象 = new 父类()
- 本质:子类原型对象等于是实例化父类,因为父类实例化之后另外开辟空间,就不会影响原来父类原型对象
- 将子类的 constructor 从新指向子类的构造函数
3 类和构造函数的区别
- class本质还是function.
- 类的所有方法都定义在类的prototype属性上
- 类创建的实例,里面也有__proto__ 指向类的prototype原型对象
- 所以ES6的类它的绝大部分功能,ES5都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。
4 练习class
写了一个Tab栏,具有切换、添加、删除、修改的功能,有兴趣可以看下duheng678.github.io/class-demo-…