JavaScript高级---(1)面向对象编程

x33g5p2x  于2021-09-24 转载在 JavaScript  
字(1.9k)|赞(0)|评价(0)|浏览(624)

一、面向对象编程POP(Process-oriented programming)

面向对象是把事务分解成为一个个对象,然后由对象之间分工与合作。

1、举例理解

我们举个例子:
把大象装进冰箱。

面向过程的编程方式是:
打开冰箱门–>把大象放进去–>关上冰箱门

面向对象则是先抽象出对象,然后再找出对象的属性方法:
1、大象:

  • 进去

2、冰箱

  • 打开
  • 关闭

2、面向对象编程的特性

  1. 封装性
  2. 继承性
  3. 多态性

3、面向对象编程的优缺点

  • 优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护 。
  • 缺点:性能比面向过程低

二、类和对象

1、类

类抽象了对象的公共部分,它泛指某一大类(class)

2、对象

对象特指某一个,通过类实例化一个具体的对象 。
对象是由属性和方法组成的:

  • 属性:事物的特征,在对象中用属性来表示
  • 方法:事物的行为,在对象中用方法来表示

3、创建类及实例化对象

创建类
js一般使用class创建类,下面就利用class关键字创建了一个类。
这里constructor是类的构造函数,用于传递参数,返回实例对象,通过 new 命令生成对象实例时,自动调用该方法。如果没有显示定义, 类内部会自动给我们创建一个constructor() 。

  1. // 构造类
  2. class Car {
  3. // 构造函数,new完之后自动执行,同时返回实例对象
  4. constructor(color, brand) {
  5. this.color = color;
  6. this.brand = brand;
  7. }
  8. // 添加方法
  9. run() {
  10. console.log("The car is running!");
  11. }
  12. }

实例化对象
我们使用new来创建对象

  1. var car = new Car('red', 'toyota');

三、类的继承

1、继承

子类可以继承父类的一些属性和方法。一般使用extends关键字。

语法:

  1. class Father{ // 父类
  2. }
  3. class Son extends Father { // 子类继承父类
  4. }

实例:

  1. class Father {
  2. constructor(surname) {
  3. this.surname= surname;
  4. }
  5. say() {
  6. console.log('你的姓是' + this.surname);
  7. }
  8. }
  9. class Son extends Father{ // 这样子类就继承了父类的属性和方法
  10. }
  11. var damao= new Son('刘');
  12. damao.say(); // 你的姓是刘

2、super关键字

super关键字 用于访问和调用对象父类上的函数。可以调用父类的构造函数,也可以调用父类的普通函数。
一般用于参数传递

  1. class Father {
  2. say() {
  3. return '我是爸爸';
  4. }
  5. }
  6. class Son extends Father { // 这样子类就继承了父类的属性和方法
  7. say() {
  8. // super.say() super 调用父类的方法
  9. return super.say() + '的儿子';
  10. }
  11. }
  12. var damao = new Son();
  13. console.log(damao.say()); // 我是爸爸

注意: 子类在构造函数中使用super, 必须放到 this 前面 (必须先调用父类的构造方法,在使用子类构造方法)

3、指向问题

这里我们举一个例子进行解释。我们先在页面上写一个button按钮。然后构造一个类,创建一个实例化对象。

  1. class Star {
  2. constructor(name, age) {
  3. this.name = name;
  4. this.age = age;
  5. // this.sing();
  6. this.btn = document.querySelector("button");
  7. this.btn.onclick = this.sing;
  8. }
  9. sing() {
  10. // 这里的this指向他的调用者btn***
  11. console.log(this.name); //undefined
  12. console.log(this);
  13. }
  14. dance() {
  15. _that = this;
  16. console.log(this);
  17. }
  18. }
  19. var ldh = new Star('ldh' 18);

当我们实例化star类后,调用sing()方法会发生什么呢?会输出ldh吗?答案是undefined,原因是sing()方法里面的this并不指向这个对象了,而是指向它的调用者btn。
我们可以在外面定义一个that来保留这个this的指向,这时候就可以正常输出了。

四、注意点总结

  1. 在 ES6 中类没有变量提升,所以必须先定义类,才能通过类实例化对象.
  2. 类里面的共有属性和方法一定要加this使用.
  3. 类里面的this指向问题.
  4. constructor 里面的this指向实例对象, 方法里面的this 指向这个方法的调用者

下一篇:JavaScript高级—(2)构造函数和原型、继承

相关文章