前端菜鸟成长记(三)之answer

关于上次作业的答案

js有几种实现继承的方法(我直接给答案,原型链继承,借用构造函数继承,组合继承)?各自的优缺点是什么?

  • 原型链继承
    ---优点:很强大可以实现继承
    ---缺点:1.重写子类的原型 等于 父类的一个实例,(父类的实例属相变成子类的原型属性)如果父类包含引用类型的属性,那么子类所有实例都会共享该属性2.在创建子类实例时,不能向父类的构造函数传递参数
  • 借用构造函数继承
    ---优点:1.避免了引用类型的属性被所有实例共享2.可以在 Child 中向 Parent 传参
    ---缺点:方法都在构造函数中定义,每次创建实例都会创建一遍方法。
    *组合继承
    ---优点:组合继承解决原型链继承的引用类型原型属性被实例共享问题
    ---缺点:两次调用父类构造函数:(第一次是在创建子类原型的时候,第二次是在子类构造函数内部)。子类继承父类的属性,一组在子类实例上,一组在子类原型上(在子类原型上创建不必要的多余的属性)(实例上的屏蔽原型上的同名属性),同时效率低。

每处的输出


3、4、5处答案

上面的例子使用的是什么继承方法?

  • 组合继承
    在这里我是有纠结一会的,我增加了一个screen




    原型链继承中一个实例不小心修改了原型对象上引用类型的值,会导致其它实例也跟着受影响。原型上任何类型的属性值都不会通过实例被重写,但是引用类型的属性值会受到实例的影响而修改,所以这里xiaoming2.screen输出['猫', '咪', '是', '大']而不是['猫', '咪', '是', '大','王']排除只是原型链的可能


在第二问处,为什么xiaoming并没有定义say方法却能正确的使用say方法?

  • Childs.prototype = new Parents();时xiaoming就继承了Parents的方法
    原型链继承有两个特征,一个是对象能够记住它的原型,二是如果对象无法响应一个请求,会委托自己的原型去处理,即通过_ proto _记住原型,如果当前我没法委托自己去处理,那么我会委托给我的父类(原型),看看它有没有,总之会沿着原型链网上找,直到找到为止,而越往原型链的祖先端,它的优先级越低,中间只要找到就不在再往后找了

在第三问处,为什么结果和第二问处不一样??

  • 重写Child.prototype,使其执行自己的方法
    JavaScript的对象最初都是由Object.prototype克隆得到的,所有对象最初的原型都指向Object.prototype,但JavaScript允许对象动态的改变对象原型的指向,也因此才有各种灵活的继承实现


你可能感兴趣的:(前端菜鸟成长记(三)之answer)