JavaScript---4.对象

  • JS中的数据类型

    • 基本数据类型
      String 字符串
      Number 数值
      Boolean 布尔值
      Null 空值
      Undefined 未定义

    • Object 对象只要看到的不是以上5种 都是对象

      • 对象属于一种复合的数据类型 在对象中可以保存多个不同数据类型的属性
  • 对象的分类

    • 内建对象

      • 由ES标准中定义的对象 在任何的ES的实现中都可以使用
        比如 Math String Number Boolean Function Object...
    • 宿主对象

      • 由JS的运行环境提供的对象,目前来说主要指由浏览器提供的对象
        比如BOM DOM
    • 自定义对象

      • 由开发人员自己创建的对象
  • 使用工厂方式创建对象

    function createPerson(name, age, gender){
    var obj = new Object();

    obj.name = name;
    obj.age = age;
    obj.gender = gender;
    obj.sayName = function(){
    alert(this.name)
    }
    return obj;
    }

    var obj2 = createPerson("smitty", 38, "男")
    console.log(obj2)

  • 构造函数

    • 创建一个构造函数 专门用来创建Person对象的
      构造函数就是一个普通的函数,构建方式和普通函数没有区别
      不同的是构造函数习惯上首字母大写

    • 构造函数和普通函数的区别就是调用方式的不同
      普通函数是直接调用
      构造函数需要使用new关键字来调用

    • 构造函数的执行流程
      1.立刻创建一个新的对象
      2.将新建的对象设置为函数中的this,在构造函数中可以使用this来引用新建的对象
      3.逐行执行函数中的代码
      4.将新建的对象作为返回值

    • 使用同一个构造函数创建的对象 称为一类对象 也将一个构造函数称为一个类
      我们将通过一个构造函数创建的对象 称为是该类的实例
      构造函数就是类
      使用Instanceof可以检查一个对象是否是一个类的实例
      语法:
      对象 instanceof 构造函数
      dog instanceof Dog

      function Person(){
      this.name = "smitty";
      this.age = 18;
      this.gender = "男";
      }

      var per = new Person();
      console.log(per);

      * 原型prototype
      * 我们所创建的每一个函数,解析器都会向函数中添加一个属性prototype
      * 这个属性对应着一个对象 这个对象就是我们所谓的原型对象
      *
      * 如果函数作为普通函数调用prototype没有任何作用
      * 当函数通过构造函数调用时,它所创建的对象中都会有一个隐含的属性
      * 指向该构造函数的原型对象 我们可以通过__proto__来访问该属性
      *
      * 原型对象就相当于一个公共的区域,所有同一个类的实例都可以访问到这个原型对象
      * 我们可以将对象中共有的内容 统一设置到原型对象中
      *
      * 当我们访问对象的一个属性或方法时,它会先在对象自身中寻找,
      * 如果有直接使用
      * 没有则会原型对象中寻找,找到直接使用
      *
      * 以后我们创建构造函数时 可以将这些对象共有的属性和方法统一添加到构造函数的原型对象中
      * 这样不用分别为每一个对象添加 也不会影响到全局作用域 就可以使每个对象都具有这些属性和方法了

      这就相当于是python类里的类属性和类方法

      function Person(name, age, gender){
      this.name = name;
      this.age = age;
      this.gender = gender;
      }

      Person.prototype.sayName = function(){
      alert("hello大家好,我是:" +this.name);
      };

      var per = new Person("smitty", 18, "男");
      var per2 = new Person("script", 20, "男");

      per.sayName();
      per2.sayName();

      //使用in检查对象中是否含有某个属性时,如果对象中没有但是原型中有,也会返回true
      function MyClass(){
      }
      MyClass.orototype.name = "我是原型中的名字";
      var mc = new MyClass();
      console.log("name" in mc)

      function MyClass(){
      }
      MyClass.prototype.name = "我是原型中的名字";

      //使用in检查对象中是否含有某个属性时,如果对象中没有但是原型中有,也会返回true
      var mc = new MyClass();
      console.log("name" in mc);

      // 可以使用对象的hasOwnPropery()来检查对象自身中是否含有该属性;
      // 使用该方法只有当对象自身中含有属性时,才会返回true;
      // console.log(mc.hasOwnProperty("age"));
      // console.log(mc.hasOwnProperty("hasOwnProperty"));
      // console.log(mc.proto.hasOwnProperty("hasOwnProperty"));

      /**
      * 原型对象也是对象,所以它也有原型
      * 当我们使用一个对象的属性或方法时,会先在自身中寻找。
      * 自身中如果有直接使用
      * 如果没有则去原型对象中寻找,如果原型对象中有,则使用
      * 如果没有则去原型的原型中找,知道找到Object对象的原型
      * 如果Object对象的原型没有原型,如果在Object中依然没有找到,则返回undefined
      **/
      console.log(mc.proto.proto__.proto__))

  • this的情况
    1.当以函数的形式调用时,this是window
    2.当以方法的形式调用时,谁调用方法this就是谁
    3.当以构造函数的形式调用时,this就是新创建的那个对象

posted @ 2021-10-28 17:49  梵高de画笔  阅读(47)  评论(0)    收藏  举报