最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • JS继承 原型链继承、构造函数继承、组合继承、原型继承、寄生式继承、寄生组合继承

    正文概述 掘金(不知东方既白)   2021-01-06   544

    一、原型链继承

    function Parent() {
       this.isShow = true
       this.info = {
           name: "yhd",
           age: 18,
       };
    }
    
    Parent.prototype.getInfo = function() {
       console.log(this.info);
       console.log(this.isShow); // true
    }
    
    function Child() {};
    Child.prototype = new Parent();
    
    let Child1 = new Child();
    Child1.info.gender = "男";
    Child1.getInfo();  // {name: "yhd", age: 18, gender: "男"}
    
    let child2 = new Child();
    child2.getInfo();  // {name: "yhd", age: 18, gender: "男"}
    child2.isShow = false
    
    console.log(child2.isShow); // false
    

    优点:

    缺点:

    二、盗用构造函数继承(构造函数继承)

    function Parent() {
      this.info = {
        name: "yhd",
        age: 19,
      }
    }
    
    function Child() {
        Parent.call(this)
    }
    
    let child1 = new Child();
    child1.info.gender = "男";
    console.log(child1.info); // {name: "yhd", age: 19, gender: "男"};
    
    let child2 = new Child();
    console.log(child2.info); // {name: "yhd", age: 19}
    

    ​ 通过使用call()apply()方法,Parent构造函数在为Child的实例创建的新对象的上下文执行了,就相当于新的Child实例对象上运行了Parent()函数中的所有初始化代码,结果就是每个实例都有自己的info属性。

    1、传递参数

    ​ 相比于原型链继承,盗用构造函数的一个优点在于可以在子类构造函数中像父类构造函数传递参数。

    function Parent(name) {
        this.info = { name: name };
    }
    function Child(name) {
        //继承自Parent,并传参
        Parent.call(this, name);
        
         //实例属性
        this.age = 18
    }
    
    let child1 = new Child("yhd");
    console.log(child1.info.name); // "yhd"
    console.log(child1.age); // 18
    
    let child2 = new Child("wxb");
    console.log(child2.info.name); // "wxb"
    console.log(child2.age); // 18
    

    ​ 在上面例子中,Parent构造函数接收一个name参数,并将他赋值给一个属性,在Child构造函数中调用Parent构造函数时传入这个参数, 实际上会在Child实例上定义name属性。为确保Parent构造函数不会覆盖Child定义的属性,可以在调用父类构造函数之后再给子类实例添加额外的属性

    优点:

    缺点:


    三、组合继承

    function Parent(name) {
       this.name = name
       this.colors = ["red", "blue", "yellow"]
    }
    Parent.prototype.sayName = function () {
       console.log(this.name);
    }
    
    function Child(name, age) {
       // 继承父类属性
       Parent.call(this, name)
       this.age = age;
    }
    // 继承父类方法
    Child.prototype = new Parent();
    
    Child.prototype.sayAge = function () {
       console.log(this.age);
    }
    
    let child1 = new Child("yhd", 19);
    child1.colors.push("pink");
    console.log(child1.colors); // ["red", "blue", "yellow", "pink"]
    child1.sayAge(); // 19
    child1.sayName(); // "yhd"
    
    let child2 = new Child("wxb", 30);
    console.log(child2.colors);  // ["red", "blue", "yellow"]
    child2.sayAge(); // 30
    child2.sayName(); // "wxb"
    
    

    ​ 上面例子中,Parent构造函数定义了name,colors两个属性,接着又在他的原型上添加了个sayName()方法。Child构造函数内部调用了Parent构造函数,同时传入了name参数,同时Child.prototype也被赋值为Parent实例,然后又在他的原型上添加了个sayAge()方法。这样就可以创建 child1,child2两个实例,让这两个实例都有自己的属性,包括colors,同时还共享了父类的sayName方法

    优点:


    四、原型式继承

    function objectCopy(obj) {
      function Fun() { };
      Fun.prototype = obj;
      return new Fun()
    }
    
    let person = {
      name: "yhd",
      age: 18,
      friends: ["jack", "tom", "rose"],
      sayName:function() {
        console.log(this.name);
      }
    }
    
    let person1 = objectCopy(person);
    person1.name = "wxb";
    person1.friends.push("lily");
    person1.sayName(); // wxb
    
    let person2 = objectCopy(person);
    person2.name = "gsr";
    person2.friends.push("kobe");
    person2.sayName(); // "gsr"
    
    console.log(person.friends); // ["jack", "tom", "rose", "lily", "kobe"]
    

    优点:

    缺点:


    五、寄生式继承

    function objectCopy(obj) {
      function Fun() { };
      Fun.prototype = obj;
      return new Fun();
    }
    
    function createAnother(original) {
      let clone = objectCopy(original);
      clone.getName = function () {
        console.log(this.name);
      };
      return clone;
    }
    
    let person = {
         name: "yhd",
         friends: ["rose", "tom", "jack"]
    }
    
    let person1 = createAnother(person);
    person1.friends.push("lily");
    console.log(person1.friends);
    person1.getName(); // yhd
    
    let person2 = createAnother(person);
    console.log(person2.friends); // ["rose", "tom", "jack", "lily"]
    

    六、寄生式组合继承

    function objectCopy(obj) {
      function Fun() { };
      Fun.prototype = obj;
      return new Fun();
    }
    
    function inheritPrototype(child, parent) {
      let prototype = objectCopy(parent.prototype); // 创建对象
      prototype.constructor = child; // 增强对象
      Child.prototype = prototype; // 赋值对象
    }
    
    function Parent(name) {
      this.name = name;
      this.friends = ["rose", "lily", "tom"]
    }
    
    Parent.prototype.sayName = function () {
      console.log(this.name);
    }
    
    function Child(name, age) {
      Parent.call(this, name);
      this.age = age;
    }
    
    inheritPrototype(Child, Parent);
    Child.prototype.sayAge = function () {
      console.log(this.age);
    }
    
    let child1 = new Child("yhd", 23);
    child1.sayAge(); // 23
    child1.sayName(); // yhd
    child1.friends.push("jack");
    console.log(child1.friends); // ["rose", "lily", "tom", "jack"]
    
    let child2 = new Child("yl", 22)
    child2.sayAge(); // 22
    child2.sayName(); // yl
    console.log(child2.friends); // ["rose", "lily", "tom"]
    

    优点:


    起源地下载网 » JS继承 原型链继承、构造函数继承、组合继承、原型继承、寄生式继承、寄生组合继承

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元