Kim丶 2018-10-18 06:24 采纳率: 0%
浏览 407

javascript原型链继承,为什么会出现这种情况,求大神解答?

 function SuperType() {
            this.colors = ["red", "blue", "green"];
        }

        function SubType() {}

        SubType.prototype = new SuperType();    //继承方法
        var instance1 = new SubType();
        console.log(instance1.colors);
        instance1.colors.push("black");
        console.log(instance1.colors);

        var instance2 = new SubType();
        console.log(instance2.colors);

执行过后,明明只在instance1中的colors数组push一个black,为什么在instance2中会出现,不是又new出来一个新的对象了吗?而且原型中的方法会共享,但继承的对象中,colors属性存在SuoerType实例上呀,为什么会影响到instance2?求大神解答。

图片说明

  • 写回答

3条回答 默认 最新

  • 天际的海浪 2018-10-18 08:56
    关注

    SubType.prototype = new SuperType(); //继承方法
    你这是一个比较常见继承方法,它是通过把子类的原型对象(prototype)设置成父类的一个实例来进行继承的。
    但是只简单的这样设置继承有三个缺点:

      缺点一:执行上面代码会发现父类的构造函数不是像JAVA中那样在给子类进行实例化时执行的,而是在设置继承的时候执行的,并且只执行一次。这往往不是我们希望的,特别是父类的构造函数中有一些特殊操作的情况下。

      缺点二:由于父类的构造函数不是在子类进行实例化时执行,在父类的构造函数中设置的成员变量到了子类中就成了所有实例对象公有的公共变量。由于JavaScript中继承只发生在“获取”属性的值时,对于属性的值是String,Number和Boolean这些数据本身不能被修改的类型时没有什么影响。但是Array和Object类型就会有问题。

      缺点三:如果父类的构造函数需要参数,我们没有办法在实例化时传递参数。

    应该用下面方式继承

            function SuperType() {
                this.colors = ["red", "blue", "green"];
            }
            function SubType() {
                SuperType.call(this);
            }
            SubType.prototype = Object.create(SuperType.prototype);
    
    评论

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料