面向对象
优点:易维护、易复用、易扩展。适合多人合作。
缺点:性能比面向过程低。
面向过程
优点:性能比面向对象高,适合跟硬件联系很紧密的东西,例如单片机。
缺点:没有面向对象易维护、易复用、易扩展。
面向对象的思维特点
1、抽取(抽象)对象共用的属性和行为封装成一个类。
2、对类进行实例化,获取类的对象。
对象
万物皆对象,对象是一个具体的事物。
在JavaScript中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象。例如:字符串、数值、数组、函数等。
对象由属性和方法组成:
属性:事物的特征,在对象中用属性来表示(常用名词)
方法:事物的行为,在对象中用方法来表示(常用动词)
类class
类抽象了对象的公共部分 ,泛指某一大类(class)
对象特指某一个,通过类实例化一个具体的对象。
创建类
语法:
class Name {
// class body
}
创建实例:
var xx = new name();
例子
// 1、创建类class,创建一个明星类
class Star {
}
// 2、利用类创建对象 new
new Star();
constructor构造函数
constructor()方法是类的构造函数(默认方法),用于传递参数,返回实例对象,通过new命令生成对象实例时,自动调用该方法。如果没有显示定义,类内部会自动给我们创建一个constructor()
// 1、创建类class,创建一个明星类
class Star {
constructor( uname,uage ){
this.name = uname;
this.age = uage;
}
sing(){
console.log("我会唱歌!")
console.log(this.name )
}
}
// 2、利用类创建对象 new
let ldh = new Star( '刘德华' );
let zxy = new Star( '张学友' );
console.log(ldh,zxy);
// 类里面所有的函数不需要写function
// 多个函数方法之间不需要添加逗号分隔
ldh.sing();
zxy.sing();
5个小tips:
1、通过class关键字创建类,类名我们还是习惯性定义首字母大写。
2、类里面有个constructor函数,可以接收传递过来的参数,同时返回实例对象。
3、constructor函数只要有new生成实例时,就会自动调用这个函数,如果我们不写这个函数,类也会自动生成这个函数。
4、生成实例new不能忽略
5、最后注意语法规范,创建类 类名后面不要加小括号,生成实例类名后面加小括号,构造函数不需要加function
继承
普通继承
// 子类不加constructor直接调用父类中的方法,可以直接使用
class Father {
constructor() {
}
money() {
console.log(100)
}
}
class Son extends Father {
}
var son = new Son()
son.money() // 100
继承+传递参数
// 子类不加constructor直接调用父类中的方法,可以直接使用
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(x, y) // super调用了父类中的构造函数,将参数1,2传入父类构造函数的x,y
}
// 其实不写constructor也能成功调用
}
var son = new Son(1, 2)
var son2 = new Son(11, 22)
son.sum() // 3
son2.sum() // 33
super关键字调用父亲普通函数
// super关键字调用父亲普通函数
// 如果不用super是什么效果 就近原则
class Father {
say() {
console.log('我是爸爸')
}
}
class Son extends Father {
say() {
console.log('我是儿子')
}
}
var son = new Son()
son.say() // '我是儿子'
// 1、继承中,如果实例化子类输出一个方法,先看子类有没有这个方法,如果有就先执行子类的
// 2、继承中,如果子类里面没有,就去查找父类有没有这个方法,如果有,就执行父类的这个方法(就近原则)
如果要使用父类的方法
// super关键字调用父亲普通函数
// 如果要使用父类的方法
class Father {
say() {
return '我是爸爸'
}
}
class Son extends Father {
say() {
console.log(super.say() + '的儿子')
}
}
var son = new Son()
son.say() // '我是爸爸的儿子'
使用类的注意事项
1、在ES6中类没有变量提升,所以必须先定义类,才能通过类实例化对象
2、类里面的共有属性和方法一定要加this使用
3、类里面的this指向问题
4、constructor里面的this指向的是创建的实例对象,方法里面的this指向这个方法的调用者