账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    JS中寄生组合式继承中为什么要使用原型式继承的方法继承父类的原型呢?
    94
    0

    本人刚开始学习js,在《js高程》上看到了寄生组合式继承这一节,但是对书上给出的代码不太明白。
    我理解的是:寄生组合式继承是为了避免组合继承中实例属性和原型对象中属性重复的问题,它使用借用构造函数的方法继承父类构造函数中的属性,使用原型式继承的方法继承父类的原型对象。
    这是书上的代码:

    function inheritPrototype(SubType,SuperType){
        var pro = Object.create(SuperType.prototype);
        pro .constructor = SubType;
        SubType.prototype = pro ;
        }

    但是,它和下面的函数有什么区别呢?

    function inheritPrototype(SubType,SuperType){
        SubType.prototype = SuperType.prototype;
        SubType.prototype.constructor = SubType;
        }

    不太明白为什么要使用原型式继承的方法继承父类的原型,原型式继承不就是一个浅复制吗?这和直接赋值有什么区别呢?

    1
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • Wouldyoulike. 普通会员 1楼

      在JavaScript中,寄生组合式继承是一种混合了原型式继承和构造函数继承的继承模式,它能有效避免传统原型链继承和借用构造函数继承的缺点。

      在传统的原型链继承中,子类会共享父类的引用类型属性,这会导致数据污染问题。而在借用构造函数(也称作经典继承)中虽然可以为每个实例创建独立的属性副本,但无法继承父类的原型方法,并且会调用两次父类构造函数,效率较低。

      寄生组合式继承的核心思想是:

      1. 使用构造函数继承来实现对父类实例属性的继承,保证每个子类实例都有自己的属性副本。
      2. 使用原型式继承(或Object.create()方法)来继承父类的原型属性和方法,而不是整个原型对象,这样可以避免引用类型的属性被所有子类实例共享的问题。

      具体步骤大致如下:

      ```javascript function inheritPrototype(subType, superType) { var prototype = Object.create(superType.prototype); // 创建一个空的对象,其原型指向superType.prototype prototype.constructor = subType; // 修复constructor指向 subType.prototype = prototype; // 将新创建的对象赋值给subType.prototype }

      function SuperType(name) { this.name = name; this.colors = ["red", "blue", "green"]; } SuperType.prototype.sayName = function () { console.log(this.name); }

      function SubType(name, age) { SuperType.call(this, name); // 继承实例属性 this.age = age; }

      inheritPrototype(SubType, SuperType); // 继承原型属性和方法

      var instance1 = new SubType("Tom", 20); var instance2 = new SubType("Jerry", 22);

      instance1.colors.push("black"); console.log(instance1.colors); // ["red", "blue", "green", "black"] console.log(instance2.colors); // ["red", "blue", "green"] 不受instance1影响 ```

      因此,使用原型式继承的方法继承父类的原型,能够同时兼顾到继承实例属性和原型属性/方法,而且不会造成不必要的资源浪费,是一种更为高效、安全的继承方式。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部