JavaScript中创建对象的多种模式

一、工厂模式

    function createPerson(name,sex,age){
      let obj = new Object
      obj.name = name
      obj.sex = sex
      obj.age = age
      obj.sayName = function(){
        alert(this.name)
      }
      return obj
    }

    // 字面量增强写法
    // function createPerson(name,sex,age){
    //   let obj = {
    //     name,
    //     sex,
    //     age,
    //     sayName(){
    //       alert(this.name)
    //     }
    //   }
    //   return obj
    // }

    let person1 = createPerson("wsh","male",19)
    let person2 = createPerson("yj","female",18)

    console.log(person1);
    console.log(person2);

缺点:无法解决对象识别的问题

二、构造函数模式

    function Person(name, sex, age) {
      this.name = name
      this.sex = sex
      this.age = age
      this.sayName = function () {
        alert(this.name)
      }
    }

    let person1 = new Person("wsh", "male", 19)
    let person2 = new Person("yj", "female", 18)

    console.log(person1);
    console.log(person2);

缺点:每个方法都要在每个实例上面重新创建一遍

三、原型模式

    function Person(){}

    Person.prototype = {
      name:"wsh",
      sex:"male",
      age:19,
      hobbies:["basketball","game"],
      sayName(){
        alert(this.name)
      }
    }

    let person1 = new Person()
    let person2 = new Person()

    person1.name = "yj"
    person1.sex = "female"
    person1.age = 18
    person1.hobbies[0] = "book"

    console.log(person1);
    console.log(person2);

运行结果:
在这里插入图片描述
缺点:
1、省略了为构造函数初始化参数,导致所有实例都将取得相同的默认值
2、 共享“引用类型值”的属性会导致所有实例的原型属性值被修改

四、组合使用构造函数模式和原型模式

    function Person(name, sex, age) {
      this.name = name
      this.sex = sex
      this.age = age
      this.hobbies = ["basketball", "game"]
    }

    Person.prototype = {
      //当重新给原型对象赋值一个对象时,必须手动添加constructor属性指向原来的构造函数
      constructor: Person,
      sayName() {
        alert(this.name)
      }
    }

    let person1 = new Person("wsh","male",19)
    let person2 = new Person("yj","female",18)

    person2.hobbies[0] = "book"

    console.log(person1);
    console.log(person2);

运行结果:
在这里插入图片描述
组合模式是目前使用最广泛、认同度最高的一种创建自定义类型的方法

五、动态原型模式

六、寄生构造函数模式

七、稳妥构造函数模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值