01-Javascript面向对象

106 阅读3分钟

一、面向对象编程介绍

1. 两大编程思想

  • 面向过程:分析出解决问题所需要的步骤,再按步骤解决问题。/蛋炒饭/
  • 面向对象:把事务分解成一个个对象,然后由对象之间分工合作。(大型项目)->封装性、继承性、多态性/盖浇饭/

2. 面向过程和面向对象对比

面向过程和面向对象对比

二、ES6中的类和对象

1. 面向对象

思维特点:

  1. 抽取对象共用的属性和行为组织封装成一个(模板)。
  2. 对类进行实例化,获取类的对象

2.对象

所有的事物都是对象。

对象是由属性和方法组成的:

  • 属性:事物的特征
  • 方法:事物的行为

3. 类 class

可用class关键字声明一个类,之后以这个类来实例化对象。

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

对象特指某一个,通过实例化一个具体的对象。

4.创建类

语法:

class name {
	//class body
    }

创建实例:

 var xx= new name

类必须使用new实例化对象

5. 类 constructor 构造函数

用于传递参数,返回实例对象。通过new命令生成对象实例时,自动调用。如果没有显示实例,那么类内部会自动创建一个constructor()。

6. 类中添加方法

  1. 类里面所有的函数不需要写function
  2. 多个函数方法之间不需要添加逗号分隔
        // 1. 创建类 class 创建一个明星类
        class Star{
            constructor(uname,age){
                this.uname = uname;
                this.age = age;
            }
            sing(song) {
            console.log(this.uname + song);
            }
        }

        // 2. 利用类生成对象 new
        var hcy = new Star('chunYoung',21);   //只要加了new就自动调用constructor
        var xhy = new Star('xiaGuo',23);
        console.log(hcy.uname);
        console.log(xhy.age);
        hcy.sing('6');
        xhy.sing('7');

三、类的继承

1.继承 extend

子类可以继承父类的一些属性和方法

语法

class Father{  //父类
}
class Son extends Father{  //子类
}

例:

        class Father{
            constructor(){

            }
            money(){
                console.log(100);
            }

        }
        class Son extends Father{

        }

        var son = new Son();
        son.money();  //继承

2.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;   这块运用的是子类的指向,而和上面的constructor不相同,父类的函数必须使用父类的constructor,出现错误
                this.y=y; */
                super(x,y);  //调用了父类上的构造函数
            }

        }
        var son = new Son(1,2);
        var son1 = new Son(11,22);
        son.sum();
        son1.sum();

输出3 33 1.//super关键字调用父类普通函数

       //super关键字调用父类普通函数
       class Father{
           say(){
               return 'hey';
           }
       }
       class Son extends Father{
           say(){
               //console.log('we');
               console.log(super.say());
           }
       }
       var son = new Son();
       son.say();  //输出hey super().say就是引用了父类函数

2.//super关键字调用父类普通函数

       //super关键字调用父类普通函数
       class Father{
           say(){
               return 'hey';
           }
       }
       class Son extends Father{
           say(){
               console.log('we');
           }
       }
       var son = new Son();
       son.say();  //输出we 就近原则

3.子类继承父类加法方法 同时扩展减法方法

       //父类有加法方法
       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调用父亲的构造函数
                //super必须在子类this之前调用
                super(x,y);
                this.x=x;
                this.y=y;
            }
            substract(){
                console.log(this.x-this.y);
            }

        }
        var son = new Son(5,3);
        son.substract();
        son.sum();  //不要忘记!!!!!!

利用super调用父亲的构造函数

super必须在子类this之前调用

四、类和对象三个注意点

  1. 在Es6类中没有变量提升,所以必须先定义类,再通过类来实例化对象

  2. 类里面共有的属性和方法必须加this来指引使用

        class Star {
            constructor(uname,age){
             this.uname=uname;
             this.age=age;
 
             this.btn=document.querySelector('button');
             this.btn.onclick=this.sing;
 
        }
        sing(){
            console.log(this.uname);
            }
        }
        var hcy= new Star('');  //输出undefined
    <button>点击</button>
 <script>
     var that;
     var _that;
     class Star {
         constructor(uname,age){
             //constructor 里面的this指向的是 创建的实例对象
             that=this;
             console.log(this);  //输出Star {}

          this.uname=uname;
          this.age=age;

          this.btn=document.querySelector('button');
          this.btn.onclick=this.sing;

     }
     sing() {
         //这里的sing方法里面的this指向的是 btn这个按钮 因为这个按钮调用了这个函数
         console.log(this); //输出<button>点击</button>

         console.log(this.uname);  //undefined 这个里面this指向的是btn 而btn里面是没有uname这个属性的
       				//输出undefined
         console.log(that.uname);  //that里面存储的是constructor里面的this 6就可以拿到了
         			//输出6
         }

     dance() {
         //这个dance里面的this指向的是实例对象hcy 因为hcy调用了这个函数
         _that=this;
         console.log(this);  //输出Star {uname: "6", age: undefined, btn: button}

     }
     }
     var hcy= new Star('6');
     console.log(that === hcy);   //输出ture
     hcy.dance();
     console.log(_that === hcy);   //输出true
  </script>