面向对象基本介绍与创建对象

对象(Object)是什么?

在软件系统中,对象具有唯一的标识符,对象包括属性(Properties)和方法(Methods),属性就是需要记忆的信息,方法就是对象能够提供的服务。在面向对象(Object Oriented)的软件中,对象(Object)是某一个类(Class)的实例(Instance)。 —— 维基百科

面向对象语言的特点:有类(class)的概念,如C++、Java。
Javascript没有类的概念,基于原型,支持面向对象。

  • 基本数据类型
    stringnumberbooleannullundefined

    nullundefined分别表示没有声明和声明后没有初始化的变量、对象,是两个简单的值,其余三个有对应的包装对象NumberBooleanString

面向对象三大特性

  • 封装
    封装就是把过程和数据封闭起来,对数据的访问只能通过开放的接口
    作用:方便维护,提高代码的复用性,信息隐蔽

  • 继承
    子类对象继成使用父亲的属性和方法

  • 多态
    多态是指两个或多个属于不同类的对象,对于同一个消息(方法调用)做出不同响应的方式
    Javascript天生就具备多态的特性(弱类型语言)

创建对象

  1. 字面量式声明对象

    使用场景:只需要简单的创建几个对象

    1
    2
    3
    var obj = {
    name : 'object'
    };

    问题:在创建同类型的代码时存在大量重复代码

  2. 使用内置的构造函数

    系统内置的构造函数: ObjectArrayDateFunction

    1
    2
    3
    var obj = new Object();
    obj.name = 'object';
    //等价于 var obj = {};

    问题:复用性不好,存在大量冗余重复代码,与字面量方式类似

  3. 简单的工厂的函数

    封装:把固定部分写在函数体中,不同的作为函数的参数传递进去

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //// 01提供函数(工厂函数)封装对象的创建过程
    function creat(name) {
    //创建一个空的对象
    var obj = new Object();
    //设置属性和方法
    obj.name = name;
    //返回对象
    return obj;
    }
    //创建对象
    var newObj = creat('objName');

    问题:创建不同类型对象时,无法识别对象

  4. 自定义构造函数创建对象

    1. 提供一个构造函数
    2. 通过this设置属性和方法
    3. 使用new构造函数创建对象

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      function Person(name, age) {
      /* 默认会创建一个新的对象
      var obj = new Object();
      默认会把新创建的对象赋值给this
      this = obj; */
      this.name = name;
      this.age = age;
      /*默认会返回新创建的对象
      return this;*/
      }
      var p1 = new Person('张三', 20);

      问题:破坏封装性,结构性不好,全局变量污染。创建多个对象时,内部属性方法一样,每次都会开辟一块新的内存空间,造成浪费
      解决办法:通过原型属性和方法

判断对象的类型

  • instanceof :判断某一变量是否为一个对象的实例
    用法:判断a是否是A的一个实例,a instanceof A;返回boolean

  • isPropertyOf:判断一个对象是否是指定对象的原型对象
    用法:判断object是否是obj的原型对象,object.isPropertyOf(obj); 返回boolean

  • constructor构造器属性,获取对象是由哪一个构造函数所创建的
    用法:获得实例对象a的构造函数 a.constructor; 返回a的构造函数