面向对象高级-各类方式创建实例对象优缺点

155 阅读1分钟

面向对象高级

对象创建模式

  1. Object构造函数模式

    • 先创建空object对象,再动态添加属性/方法
    • 适用场景:起始时不确定对象内部数据
    • 问题:语句太多
    var p = new Object()//var obj = {};
    p.name = "a"
    p.age = 12
    p.setName = function (name) {
        this.name = name
    }
    
  2. 对象字面量模式

    • 使用{ }创建对象,同时指定属性/方法
    • 适用场景:起始时对象内部数据确定
    • 问题:若创建多个对象,有重复代码
    var p = {
        name:"a",
        age:12
    }
    
  3. 工厂模式

    • 通过工厂函数动态创建对象并返回
    • 适用场景:需要创建多个对象
    • 问题:对象没有一个具体的类型,都是Object类型,均是Object构造函数的实例对象
    function creatP(name,age){ //返回一个对象函数===>工厂函数
        var obj = {
            name:name,
            age:age
        }
        return obj
    }
    var p1 = creatP("a",10)
    var p2 = ceartP("b",12)
    console.log(p1 instanceof Object)//true
    console.log(p2 instanceof Object)//true
    
  4. 自定义构造函数模式

    • 自定义构造函数,通过new创建对象

    • 适用场景:需要创建多个类型确定的对象,不同构造函数的实例对象

    • 问题:每个实例对象都有相同的方法数据,浪费内存,方法加原型!

      //定义类型
      function Person(name,age) {
          this.name = name
          this.age = age
          this.setName = function (name) {//一般放在原型空间 Person.prototype.setName
              this.name = name
          }
      }
      var p1 = new Person("Tom",12)
      p1.setName("Jack")
      console.log(p1.name,p1.age)
      
      function Student(name,price) {
          this.name = name
          this.price = price
      }
      
      var p2 = new Student("Jack",1000)
      
      console.log(p1 instanceof Preson)//true
      console.log(p2 instanceof Student)//true
      
      
  5. 自定义构造函数模+原型模式

    • 自定义构造函数,属性在函数中初始化,方法加到原型
    • 适用场景:需要创建多个类型确定的对象