这篇文章主要为大家介绍了js面试题继承的方法及优缺点解答,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

目录

说一说js继承的方法和优缺点?

一、原型链继承

二、借用构造函数(经典继承)

三、组合继承

四、原型式继承

五、寄生式继承

六、寄生组合式继承


说一说js继承的方法和优缺点?

要点: 原型链继承、借用构造函数继承、组合继承、原型式继承、寄生式继承、寄生组合式继承、ES6 Class

答:

一、原型链继承

缺点:

  • 1.引用类型的属性被所有实例共享
  • 2.在创建 Child 的实例时,不能向 Parent 传参

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

//原型链继承

        function Parent() {

            this.parentPrototype = "parent prototype"

            //验证这种继承方法的确定,如果父类示例中存在一个引用类型的属性,将会被所有子类共享

            this.parentObj = {

                info: "我是 parent 引用属性parentObj中的 info"

            }

        }

        function Children() {

        }

        //将Children的原型对象指定为Parent的示例,通过原型链,将Parent中的属性赋值给Children示例

        Children.prototype = new Parent();

        const a = new Children();

        console.log(a.parentPrototype); // parent prototype

        //缺点

        const b = new Children();

        //在a示例中改动继承的引用属性

        a.parentObj.info = "我是a示例中 引用属性parentObj中的 info"

        //b与a示例共享引用属性

        console.log(b.parentObj.info); // 我是a示例中 引用属性parentObj中的 info

二、借用构造函数(经典继承)

优点:

  • 1.避免了引用类型的属性被所有实例共享
  • 2.可以在 Child 中向 Parent 传参

缺点:

  • 1.方法都在构造函数中定义,每次创建实例都会创建一遍方法。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

function Parent() {

                this.parentPrototype = "parent prototype"

                this.obj = {

                    info: "parent obj info"

                }

                this.fn = function () {

                    console.log("打印功能")

                }

            }

            function Children() {

                Parent.call(this);

            }

            const a = new Children();

            console.log(a.parentPrototype); // parent ptototype

            //缺点 此时Parent()会再次创建一个fn函数,这个是没有必要的

            const b = new Children();

            a.obj.info = "a obj info";

            //优点 避免了子类实例共享引用属性

            console.log(b.obj.info) // parent obj info;

三、组合继承

优点:

  • 1.融合原型链继承和构造函数的优点,是 JavaScript 中最常用的继承模式。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

function Parent() {

                this.parentPrototype = "我是Parent 中的属性"

            }

            //Parent中的方法,在原型上定义

            Parent.prototype.pFn = function () {

                console.log('我是Parent中的方法');

            }

            function Children() {

                //Parent中的属性仍然在构造函数中继承

                Parent.call(this);

            }

            //将Children的原型对象赋值为 Parent实例,这样Parent中的方法也能够被Children继承

            Children.prototype = new Parent();

            const c = new Children();

            console.log(c.parentPrototype); //我是Parent 中的属性

            c.pFn(); //我是Parent中的方法

四、原型式继承

缺点: - 1.包含引用类型的属性值始终都会共享相应的值,这点跟原型链继承一样。

1

2

3

4

5

6

7

8

9

10

11

function objFn(o) {

                o.objFnPrototype = "我是 objFnPrototype"

                function F() {}

                F.prototype = o;

                return new F();

            }

            let a = objFn({

                name: "name1"

            });

            console.log(a.name); //name1

            console.log(a.objFnPrototype); //我是 objFnPrototype

五、寄生式继承

缺点:

  • 1.跟借用构造函数模式一样,每次创建对象都会创建一遍方法。

1

2

3

4

5

6

7

8

9

10

11

function createObje(obj) {

                let clone = Object.assign(obj); //接受到对象后,原封不动的创建一个新对象

                clone.prototype1 = "我是新增的prototype1"; //在新对象上新增属性,这就是所谓的寄生

                return clone; //返回新对象

            }

            const parent = {

                parentPrototype: "parentPrototype"

            }

            //c实例,就继承了parent的所有属性

            let c = createObje(parent);

            console.log(c.parentPrototype); //parentPrototype

六、寄生组合式继承

优点:

  • 1.这种方式的高效率体现它只调用了一次 Parent 构造函数,并且因此避免了在 Parent.prototype 上面创建不必要的、多余的属性。
  • 2.与此同时,原型链还能保持不变;
  • 3.因此,还能够正常使用 instanceof 和 isPrototypeOf。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

function inherProto(superType, subType) {

                //拷贝一个超类的原型副本

                let proto = {

                    ...superType.prototype

                };

                //将原型的超类副本作为子类的原型对象,也就是第一种中的原型链继承方式,只不过继承的是超类原型的副本

                subType.prototype = proto;

                //这一步比较迷,官方的说法是,我们在拷贝超类的原型的时候,拷贝的proto对象,将会丢失默认自己的构造函数,也就是superType,

                //所以我们这里将它的构造函数补全为subType。貌似不做这一步也没啥问题,但是缺了点东西可能会有其他的副作用,所以还是补上

                proto.constructor = subType;

            }

            function Super() {

                this.superProto = "super proto";

                this.colors = ["red", "yelloy"];

            }

            function Sub() {

                this.subProto = "sub proto";

                this.name = "sub name";

                //这里还是借用构造函数的套路

                Super.call(this);

            }

            Super.prototype.getName = function () {

                console.log(this.name);

            }

            //这里要在定义完Super的属性后执行,因为继承的是超类原型的副本,与Super.prototype是两个对象,在这之后再改变Super.prototype,就已经不会在影响到Sub所继承的副本超类原型对象了

            inherProto(Super, Sub);

            let a = new Sub();

            console.log(a.getName);

以上就是js面试题继承的方法及优缺点解答的详细内容。

300+Python经典编程案例
50G+学习视频教程
100+Python初阶、中阶、高阶电子书籍
1000+简历模板和汇报PPT模板(转正、年终等)

点击拿去

js面试题继承的方法及优缺点解答相关推荐

  1. js继承的方法及原理

    js继承的方法及原理 1.原型链继承 原理:父类的实例作为子类的原型 function Woman(){ } Woman.prototype= new People(); Woman.prototyp ...

  2. 深入理解js中实现继承的原理和方法

    原型对象继承 原理:原型对象的属性可以经由对象实例访问 下面的例子,所含[对象继承]和[构造函数继承],用于理解[原型属性经由对象实例访问] //对象继承 var person = {name:&qu ...

  3. 2017面试分享(js面试题记录)

    2017面试分享(js面试题记录) 1. 最简单的一道题 '11' * 2'a8' * 3 2. 一道this的问题 var num = 10;var obj = {num:8,inner: {num ...

  4. 原生JS 面试题 (基础)(概率大)

    文章目录 1.面试题: 请描述一下 location.go(-1) 和 history.go(-1) 有什么区别 2.面试题:什么是 cookie? 如何回答! 3.面试题: 描述一下 cookie ...

  5. js面试题(持续更新)

    js面试题 new操作符具体干了什么 创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型 属性和方法被加入到 this 引用的对象中 新创建的对象由 this 所引用,并且最后隐 ...

  6. js 数组移除_2020前端面试--常见的js面试题

    (答案持续更新...) 1.简述同步和异步的区别 js是一门单线程语言,所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务 ...

  7. 面试官问:能否模拟实现JS的call和apply方法

    写于2018年11月30日,发布在掘金上阅读量近一万,现在发布到微信公众号申明原创.相对比较基础的知识,虽然日常开发可能用得比较少,各种源码中有很多call和apply,需要掌握. 前言 这是面试官问 ...

  8. (五)不只是 huohuo 的 JS 面试题

    写过最多的是 JS 相关的文章,做过最完整的是 JS 的思维导图,敲过最多的依然是 JS 代码,我觉得自己的 JS 还算可以了.写到这里的时候,我已经离职一周,也参加了几次面试,大多数问题都能按自己的 ...

  9. javascript算法+手写js面试题

    链表 function ListNode(val, next) {this.val = (val===undefined ? 0 : val)this.next = (next===undefined ...

最新文章

  1. 纯CSS实现立方体旋转
  2. 基因序列算法:编辑距离( Levenshtein 距离)和LD算法
  3. 55种网页常用小技巧(javascript) (转)
  4. mac系统更新后code .命令打不开vs code
  5. 2017.6.21 大都市meg 思考记录
  6. Atlas 配置高可用
  7. python实战1.0——爬取知乎某问题下的回复
  8. 【优化分配】基于matlab鱼群算法求解无线电功率分配优化问题【含Matlab源码 1523期】
  9. 单片机与PC通信:USB转TTL、USB转RS232、RS232转TTL等情况的分析
  10. PPT高手必须树立的十个理念
  11. PHP 公众号文章 转 pdf,使用Python爬取微信公众号文章并保存为PDF文件(解决图片不显示的问题)...
  12. DA-4-FixBi: Bridging Domain Spaces for Unsupervised Domain Adaptation
  13. VUE报错rowserslist: caniuse-lite is outdated. Please run the following command: `npx browser
  14. 2020牛客暑期多校训练营(第九场) The Escape Plan of Groundhog
  15. Vue.js 框架源码与进阶 - 搭建自己的SSR
  16. 【问题记录】更换域名的DNS时,浏览器许久不生效。
  17. cf_global_round7
  18. 思考题:现在有4分钟的沙漏和7分钟的沙漏,如何计算出9分钟的时间
  19. canvas scale()画布缩放的使用
  20. F2FS源码分析-1.3 [F2FS 元数据布局部分] Checkpoint结构

热门文章

  1. [淡藤]最近几年在China-pub上买的书
  2. java sql2016驱动_微软发布用于SQL Server 的JDBC 6.0驱动下载 - IT之家
  3. 恐怖袭击警报邮件暗藏木马
  4. 器:fdisk ,gparted添加分区,调整分区,,,whatever,,,
  5. 在校外如何安全访问校园内网资源?快解析内网穿透
  6. js 跳转html,js页面跳转方式 js页面跳转举例
  7. 周大福践行「百周年承诺」,真诚服务推动绿色环保
  8. 怎样从计算机科学到神经科学,《化腐为奇 从元素周期表到纳米技术 万物有识 从脑认知到思维风暴,神经科学趣史 无所不能 从逻辑运算到人工智能,计算机科学趣史》—甲虎网一站式图书批发平台...
  9. 使用python发送qq消息_使用Python发送QQ信息
  10. 可可西里从来不是诗意的远方