JavaScript 对象创建 1.0(Day16)

59 阅读2分钟

对象创建

工厂化方法创建对象

  • 目的:批量创建对象,减少重复代码
  • 缺点:
    • 无法读取出对象所属类型,均为Object类型
    • 函数重复、浪费资源

示例:

    function createPerson(params) {
        var obj = new Object()
        obj.name=params.name
        obj.age=params.age
        obj.gender=params.gender
        obj.sayName=function (){
            console.log(this.name)
        }
        return obj
    }
    var obj1 = createPerson({
        name:'沙僧',
        age:800,
        gender:'男'
    })
    console.log(obj1)
    //结果:{name: '沙僧', age: 800, gender: '男', sayName: ƒ}
    obj1.sayName()
    //结果:沙僧

构造函数

  • 构造函数就是一个普通函数,创建方式与普通函数相同

  • 构造函数默认首字母大写

  • 调用区别

    • 普通函数:直接调用
    • 构造函数:使用关键字进行调用
  • 执行流程

    1. 调用构造函数会立刻创建一个新的对象

    2. 将新建的对象设置为函数中的this,在构造函数中可使用this来引用新建的对象

    3. 逐行执行函数中的代码

    4. 将新建的对象作为返回值返回

    5. 示例:

          function Person(params) {
              this.name = params.name
              this.age = params.age
              this.gender = params.gender
              this.sayName = function () {
                  console.log(this.name)
              }
          }
      
          var person = new Person({
              name: '沙僧',
              age: 500,
              gender: '男'
          })
          console.log(person)
          // 结果:Person {name: '沙僧', age: 500, gender: '男', sayName: ƒ}
          person.sayName()
          // 结果:沙僧
      
  • 使用同一个构造函数创建的对象称为同类对象,也将一个构造函数称为类

  • 将通过一个构造函数创造的对象称为该类(构造函数)的实例

  • 所有对象均为Object的后代

  • 使用instanceof可检查某一实例是否属于某一类

    • 该方法返回值为boolean类型
    • 任何对象使用该方法检查是否属于Object类时,结果均为true
    console.log(person instanceof Person)
    // 结果:true
    

优化

优化前

  • 方法在构造函数内部创建

    1. 构造函数没执行一次即创建一个新的方法
    2. 所有实例的方法都是唯一的
    3. 新的方法都相同,内存空间占用严重

优化后

  • 目的:减少内存占用,提升性能

  • 实现

    1. 将目标方法在全局作用域中定义

          function fn(){
              console.log(this.name)
          }
      
    2. 将方法赋值给实例

          function Person(params) {
              this.name = params.name
              this.age = params.age
              this.gender = params.gender
              this.sayName = fn
          }