类和对象
前言
面向对象 更贴近我们的实际生活
可以使用面向对象来描述现实世界事物 但是事物可以分为具体的事物和抽象的事物
比如说 手机 和 华为
手机就是抽象的 泛指所有手机
华为就是具体的 特指华为品牌的手机
面向对象的思维特点
抽取(抽象的)对象共用的属性和行为 封装为一个类(模板)
对类进行实例化 , 获取类的对象
面向对象编程我们考虑的是有哪些对象 按照面向对象的思维特点
不断创建对象
指挥对象做事情
对象
这里的对象指的是现实生活中的对象
在现实生活中 所有东西都是对象
对象指的是一个具体的事物 看得见也摸得着的实物
比如说 一本书 一个人等等
一个网页 , 一个数据库 等等也是一个对象
在我们JavaScript中 对象一组无序的相关属性和方法的集合
所有事物都是对象 比如字符串 数组 函数等等
所以我们可以理解为
只要是对象 就是由属性和方法组成的
属性: 事物的特征
方法: 事物的行为
class 类
在ES6中新增了类的概念 可以用关键字 class 来声明一个类 之后以这个类来实例化对象
简单的说
类的使用方法和构造函数类似 但相比起来语法更加规范
创建类
语法如下
添加属性
我们的开发中
不太可能创造空对象 一般对象都有属性
我们es6中用class创建对象 也可以添加属性
利用constructor()方法
constructor()方法
constructor写在class里面
语法如下
class Star{
constructor (uname,age){
this.uname = uname;
this.age = age;
}
}
我们实例化一个对象并打印出来看看结果如何
类里面添加方法
对象里面不只有属性 还有方法
我们也可以类里面添加方法
这里我们要知道几个类的规范
1 类里面的函数不需要加function
2 类里面多个函数和方法之间不需要添加逗号
那我们按照规范来添加方法试试看
类的继承
在没有ES6的时代,想要实现继承是一个不小的工作。
一方面我们要创建父类的属性,另一方面我们需要继承父类的方法
但是在类中
我们可以用上extends
语法如下
class 继承属性的类 extends 被继承属性的类{}
因为这里是创造一个函数同时继承被继承函数的属性和方法
所以要记得加上{}
案例如下
发现方法还有属性都可以调用
super()
当super 作为函数调用时, 它代表的指向的是父类的构造函数,在子类的构造函数必须执行一次 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){
this.x = x;
this.y = y;
}
}
let x =new Son(2,4);
x.sum();
我们让Son继承了Father的属性和方法
并且实例化了一个对象
如何我们试试方法的调用
这里报错是因为this的指向问题
虽然继承了方法 但是在类Father的方法中 this指向的还是类Father
这时候我们就要用上super()函数
这里的x和y代表子类的x和y
调用的时候 把子类的x和y分别传递给父类的x和y
从而达到了我们想要的效果
调用普通函数
在我们开发中 不是只有调用构造函数 也要调用普通函数
这时候我们也可以用super()来调用普通函数
语法 super.要调用的函数名()
class Father{
sayhi(){
return '啊 困';
};
}
class Son extends Father{
sayhi(){
console.log('睡觉了');
}
}
let x =new Son();
x.sayhi();
这时候我们打印的结果还是子类的sayhi内容
那么我们想要它打印的父类的结果
就使用super来调用普通函数
注意规范 super要放在this的前面
在我们实际开发中
子类继承父类 还会额外开辟新的方法
但是如果这时候我们调用了父类函数
就会报错
所以我们要把super写在this前面
使用类的注意点
注意点1
在es6中类是没有变量提升的 所以必须先定义类 才能通过类实例化对象
简单的说 就是类必须写在实例化的前面
注意点2
我们在普通函数中想要调用构造函数的属性
必须加上this
注意点3
当我们在类的构造函数中
添加方法函数的时候 也要添加this