JavaScript面向对象学习(part1)——笔记整理+课后练习 ×1+this指向问题

文章目录
一.面向过程与面向对象
   1.2面向对象
   1.3面向过程与面向对象对比
二.对象与类
   2.1对象
   2.1.1创建对象
   2.2类
   2.2.1创建类
   2.2.3类的继承

一.面向过程与面向对象

1.2面向对象

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

1.3面向过程与面向对象对比

面向过程 面向对象
优点 性能比面向对象高,适合跟硬件联系很紧密的东西,例如单片机就采用的面向过程编程。 易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护
缺点 不易维护、不易复用、不易扩展 性能比面向过程低

二.对象与类

2.1对象

对象是由属性和方法组成的:是一个无序键值对的集合,指的是一个具体的事物

  • 属性:事物的特征,在对象中用属性来表示(常用名词)
  • 方法:事物的行为,在对象中用方法来表示(常用动词)

2.1.1创建对象

创建对象:

//字面量创建对象
var ldh = {
    name: '易烊千玺',
    age: 18
}
console.log(ldh);

构造函数创建对象:

//构造函数创建对象
  function Star(name, age) {
    this.name = name;
    this.age = age;
 }
var ldh = new Star('易烊千玺', 18)//实例化对象
console.log(ldh);	

2.2类

  • ES6后,可以使用 class 关键字声明一个类,之后以这个类来实例化对象。类抽象了对象的公共部分,它泛指某一大类(class)对象特指某一个,通过类实例化一个具体的对象。

2.2.1创建类

  1. 语法:
//步骤1 使用class关键字
class name {
  // class body
}     
//步骤2使用定义的类创建实例  注意new关键字
var xx = new name();     
  1. 示例
 // 1. 创建类 class  创建一个 明星类
 class Star {
   // 类的共有属性放到 constructor 里面
   constructor(name, age) {
   this.name = name;
   this.age = age;
   }
 }
   // 2. 利用类创建对象 new
   var ldh = new Star('易烊千玺', 18);
   console.log(ldh);

创建对象注意事项:

  1. 通过class 关键字创建类, 类名习惯性定义首字母大写
  2. 类里面有个constructor 函数,可以接受传递过来的参数,同时返回实例对象
  3. constructor 函数 只要 new 生成实例时,就会自动调用这个函数, 如果不写这个函数,类也会默认自动生成这个函数
  4. 多个函数方法之间不需要添加逗号分隔
  5. 生成实例 new 不能省略
  6. 语法规范, 创建类 类名后面不要加小括号,生成实例 类名后面加小括号, 构造函数不需要加function

2.2.3类的继承

  1. 语法(extends)继承父类
// 父类
class Father{   
} 

// 子类继承父类
class  Son  extends Father {  
}       
  1. 子类使用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(x, y); //使用super调用了父类中的构造函数
    	}
    }
    var son = new Son(1, 2);
    son.sum(); //结果为3

注意:

  1. 继承中,如果实例化子类输出一个方法,先看子类有没有这个方法,如果有就先执行子类的

  2. 继承中,如果子类里面没有,就去查找父类有没有这个方法,如果有,就执行父类的这个方法(就近原则)

  3. 如果子类想要继承父类的方法,同时在自己内部扩展自己的方法,利用super 调用父类的构造函数,super 必须在子类this之前调用

  4. 在 ES6 中类没有变量提升,所以必须先定义类,才能通过类实例化对象


时刻注意this的指向问题,类里面的共有的属性和方法一定要加this使用.

  1. constructor中的this指向的是new出来的实例对象
  2. 自定义的方法,一般也指向的new出来的实例对象
  3. 绑定事件之后this指向的就是触发事件的事件源

练习题part:

子类继承父类的属性和方法

  • 题目描述

    一个父类中有money(钱) cars(车) house(房) company(公司) 属性,有管理(manage)的方法,子类要继承父类中的属性和方法

  • 训练目标

    能够理解继承的原理

  • 训练提示

    1. 创建父类添加属性和方法
    2. 子类通过extends关键字继承到父类的属性和方法
    3. 注意constructor和this的问题
<script>
        class Father {
            constructor(money, cars, house, company) {
                this.money = 100000000;
                this.cars = '保时捷';
                this.house = '海景别墅';
                this.company = '开心代码有限公司';
            }
            manages(manage) {
                console.log('吃饭睡觉码代码吃饭睡觉码代码');
            }
        }

        class Son extends Father {
            //儿子啥都不想干啥都不会
        }

        var result = new Son();
        console.log(result.money + 'and' + result.cars + 'and' + result.house + 'and' + result.company);
        result.manages();
    </script>

在这里插入图片描述


码代码

你可能感兴趣的:(JavaScript学习)