高级JS对象创建模式与原型链继承六

// 工厂模式
    function setObj(name, age) {
      var obj = {
      name: name,
      age: age,
      setName: function(name) {
        this.name = name
        console.log(this.name);
        console.log(this);
        }
      }
      return obj
    }
    var result = setObj('wangwu', 18)
    console.log(result.name);
    result.setName('zhangshan')

    // 定义构造函数模式混合原型
    function Person(name, age) {
      this.name = name;
      this.age = age
    }
    Person.prototype.setName = function(name) {
      this.name = name
    }
    var p1 = new Person('xiaoli',18)
    var p2 = new Person('xioahong', 19)
    console.log(p1,p2);

对象创建模式:

  • 工厂模式:返回一个对象的函数,就是工厂函数;适用场景:需要创建多个对象;问题:对象没有一个具体的类型,都是object类型;
  • 自定义构造函数模式:通过new创建对象;适用:需要创建多个确定的对象;问题:每个对象都是相同的数据,浪费内存;
  • 原型组合模式:构造函数中只初始化一般函数,将方法挂载在原型上;
// 父
    function Supper() {
      this.supProp = 'supper prototype'
    }
    Supper.prototype.showSupperProp = function() {
      console.log(this.supProp);
    }
    // 子
    function Sub() {
      this.subProp = 'Sub prototype'
    }
    // 子类的原型成为父类的实例对象
    Sub.prototype = new Supper();
    Sub.prototype.constructor = Sub
    Sub.prototype.showSubProp = function() {
      console.log(this.subProp);
    }
    var sub = new Sub()
    sub.showSupperProp()
    sub.showSubProp()
    console.log(sub.toString);
    console.log(sub.constructor);

    // 借助构造函数
    function Person(name, age) {
      this.name = name
      this.age = age
    }
    function Student(name, age, price) {
      Person.call(this, name, age)
      this.price = price

    }
    var s = new Student('zhangsan',18,1000);
    console.log(s.name, s.age, s.price);

    // 完整继承
    function Fu(name, age) {
      this.name = name
      this.age = age
    }
    Fu.prototype.setName = function(name) {
      this.name = name
    }
    function Zi(name,age,price) {
      Fu.call(this, name, age)
      this.price = price
    }
    Zi.prototype = new Fu();
    Zi.prototype.constructor = Zi
    Zi.prototype.setPrice = function(price) {
      this.price = price
    }
    var zi = new Zi('xiaoxuesheng', 12, 199999);
    console.log(zi.name, zi.age,zi.price);
    zi.setName('haunyige');
    zi.setPrice('9999')
    console.log(zi.name, zi.age,zi.price);

原型链继承:

  • 要实现子类(构造函数)的原型成为父类(构造函数)的实例对象,这样,子类就可以使用父类原型上的属性方法;
  • 最终需要让子类的(实例对象)原型中的constructor指向自己(构造函数);
  • 借用构造函数继承(假):定义父类构造函数、子类构造函数,在子类构造函数中调用父类构造;关键:在子类中用call()调用父类构造函数;
  • 组合:原型链+借用构造阿含糊的组合继承;1.利用原型链实现对父类对象的方法继承;2.利用call()借用父类函数初始化相同属性;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值