javascript面向对象之对象的深入理解

目录
  • 1.面向对象与面向编程的比较
    • 1.1 面向对象(oop)
    • 1.2 面向过程(pop)
  • 2. ES6中的类和对象
    • 2.1 类的创建
    • 2.2 类 constructor 构造函数
    • 2.3 类的继承
    • 2.4 注意点
  • 补充

    本文进一步分析讲述了javascript面向对象之对象的深入理解。分享给大家供大家参考。

    1.面向对象与面向编程的比较

    1.1 面向对象(oop)

    • 面向对象是把事物分解称为一个个对象,然后由对象之间分工与合作,是以对象功能划分问题,而不是步骤
    • 特征: 封装性、继承性、多态性
    • 优点: 优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护
    • 缺点: 性能比面向过程低

    面向对象的思维特点:

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

    1.2 面向过程(pop)

    • 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了,面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了
    • 优点:性能比面向对象高,适合跟硬件联系很紧密的东西,例如单片机就采用的面向过程编程。
    • 缺点:没有面向对象易维护、易复用、易扩展

    2. ES6中的类和对象

    在js中,对象是一组无序的相关属性和方法的集合,万物皆对象
    对象是由属性和方法组成的:

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

    在 ES6 中新增加了类的概念,可以使用 class 关键字声明一个类,之后以这个类来实例化对象
    类与对象的区别:

    • 类抽象了对象的公共部分,它泛指某一大类(class)
    • 对象特指某一个,通过类实例化一个具体的对象

    2.1 类的创建

    语法:

    class name {
    // 添加属性和方法,也可以再嵌入一个类
    	class age {},	
    }

    创建实例

    let a = new name();
    // 类必须使用new实例化对象

    2.2 类 constructor 构造函数

    constructor() 方法是类的构造函数(默认方法),用于传递参数,返回实例对象,通过 new 命令生成对象实例时,自动调用该方法。如果没有显示定义, 类内部会自动给我们创建一个constructor()

    语法:

    class Person {
      constructor(name,age) {   // constructor 构造方法或者构造函数
          this.name = name;
          this.age = age;
        }
        sayHi() {
        console.log('我会唱歌');
        }
        // 注意,方法之间不需要加逗号。同时函数不需要加function关键字
    } 

    创建实例:

    var ldh = new Person('刘德华', 18); 
    console.log(ldh.name);
    ldh.sayHi();

    2.3 类的继承

    实例:

    class Father {
          constructor(surname) {
            this.surname= surname;
          }
          say() {
            console.log('你的姓是' + this.surname);
           }
    }
    class Son extends Father{  // 这样子类就继承了父类的属性和方法
    }
    var damao= new Son('刘');
    damao.say(); 

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

    语法:

    class Father {
                constructor(x,y) {
                    this.x = x;
                    this.y = y;
                }
                sum() {
                    console.log(this.x + this.y);
                }
               say() {
                   return '我是爸爸';
               }
            }
    class Son extends Father{
                constructor(x,y) {
                    // this.x = x;
                    // this.y = y;
                   super(x,y); // 调用了父类中的构造函数  ,super必须写在子类this之前调用
                   // 子类在构造函数中使用super, 必须放到 this 前面  (必须先调用父类的构造方法,在使用子类构造方法)
                    this.x = x;
                    this.y = y;
                }
                say() {
                    console.log(super.say() + '的儿子');  // 利用super调用父类的函数
                }
                substract() {
                    console.log(this.x - this.y);
                }
            }
            var son = new Son(11,2);
            console.log(son);
            son.say();
            son.substract();
            son.sum(); 

    2.4 注意点

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

    补充

    具体分析如下:

    javacript面向对象程序设计中,可以理解为一切都是对象。

    实例代码如下:

    <script language="javascript" type="text/javascript">
    function Cat(){
    }
    var cat1 = new Cat();//创建类实例
    cat1.name = "小狗";
    cat1.age = 4;
    cat1.color="白色";
    document.write(cat1.name);
    document.writeln(cat1.constructor);//实例化后对象,是对象
    document.writeln(typeof(cat1)+"<hr />");
    document.writeln(Cat.constructor);//原型对象本身也是对象
    document.writeln(typeof Cat+"<hr />");
    var b="hello";//字符串也是对象
    document.writeln(b.constructor);//输出它的构造函数
    document.writeln(typeof b+"<hr />");
    var c=123;//数值也是对象
    document.writeln(c.constructor);
    document.writeln(typeof c+"<hr />");
    </script>

    判断一个实例化对象是不是某个原型对象类型

    if(cat1 instanceof Cat){//与php的判断方法相同
     window.alert("ok");
    }

    希望本文所述对大家的javascript程序设计有所帮助。

    本文转自网络,如有侵权请联系客服删除。