javaScript中的面向对象概念(ES6)
1. 什么是对象?
1. 现实生活中:万物皆对象,对象是一个具体的事物,看的见摸得着的实物。例如,一本书、一辆汽车、一个人可以是”对象”,一个数据库、一张网页、一个与远程服务器的连接也可以是”对象”(千万别理解成那个对象)。
2. 在javaScript中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象,例如字符串、数值、数组、函数等。
3. 面向对象更贴近我们的实际生活,可以使用面向对象来描述现实事物,但是事物分为具体的事物和抽象的事物。
比如:手机 抽想的(泛指的) 具体的(特指的)
4. 对象是由属性和方法组成的。
- 属性:事物的特征,在对象中用属性来表示(常用名词)
- 方法:事物的行为,在对象中用方法来表示(常用动词)
2. 面向对象的思维特点
1. 抽取(抽象)对象共用的属性和行为组织(封装)成一个类(模板)。
2. 对类进行实例化,获取类的对象。
3. 面向对象编程我们考虑的是有哪些对象,按照面向对象的思维特点不断的创建对象,使用对象,指挥对象做事情。
3. 类 class
在ES6中新增加类的概念,可以使用关键字声明一个类,之后这个类来实例化对象。 类抽象了对象的公共部分,它泛指某一大类。比如:手机 苹果 例子:对象特指某一个,通过类实例化一个具体的对象。比如我正在吃苹果。
4. 创建类
语法:class 类名{//代码内容}
var xx = new Uname
注意:类必须new来实例化对象
5. constructor构造函数
constructor()方法是类的构造函数(默认方法),用于传递参数,返回实例对象,通过new命令生成对象实例时,自动调用该方法,如果没有显示定义,类的内部会自动给我们创建一个constructor()。
实例:
class Start {
constructor(uname, age, starger) {
this.name = uname;
this.age = age;
this.starger = starger;
}
sing(g) {
console.log(this.name + g);
}
}
let zs = new Start('张三', 18, 50);
let ls = new Start('李四', 20, 48);
console.log(zs.name);
console.log(ls.name);
zs.sing('哈哈');
ls.sing('嘿嘿');
运行结果
张三哈哈 李四嘿嘿
注意点:
通过class关键字创建类,类名我们还是习惯性首字母定义成大写。
类里面有个constructor 函数,可以接受传递过来的参数,同时 返回实例对象。
constructor函数只要 new生成实例时,就会自动调用这个函数, 如果我们不写这个函数,类也会自动生成这个函数。
生成 new 不能省略。
最后注意语法规范,创建类 类名后面要加小括号,构造函数不需 要加function。
继承
现实中的继承:比如子承父业,比如我们都继承了父亲的姓。
在ES6中实现继承的方式是通过extends关键字
super关键字
super关键字用于访问和调用对象父类上的函数,可以调用父类的构造函数 也可以调用父类的普通函数。
继承中,如果实例化子类输出一个方法,先看子类有没有这个方法,如果有就执行子类的。
继承中,如果子类里面没有,就去查找父类有没有这个方法,如果有,就执行父类这个方法(就近原则)。
子类调用父类普通函数的方法super().方法()
注意:子类在构造函数中使用super,必须放到this前面(必须先调用父类的构造方法,在使用子类的构造方法)。
代码示例:
//父类
class Numbear{
constructor(x, y) {
this.x = x;
this.y = y;
}
sum() {
var sex = this.x + this.y
console.log(sex);
}
}
//子类
class Num extends Numbear {
constructor(x, y) {
super(x, y);
this.x = x;
this.y = y;
}
result() {
var sex = this.x - this.y;
console.log(sex);
}
}
var son = new Num(10, 6);
son.sum();
son.result()
运行结果
16,4
注意点
- 在ES6中没有变量提升,所以必须先定义类,才能通过类实例化对象。
- 类里面的共有属性和方法一定要加this使用。
- constructor里面的this指向实例对象,方法里面的this指向这个方法的调用者。
- 有时候构造函数里面有其他对象但是我们想让他指向创建的这个对象里面的方法此时我们可以声明一个全局变量然后在构造函数里面让this赋值给一个变量通过变量来调用这个方法(变量名.)。