漠河县 赞皇县 出国 白山市 许昌县 青冈县 定南县 阳信县 芮城县 衡阳市 缙云县 珲春市 财经 金乡县 朝阳县 通河县

文章导航软件下载单机游戏安卓资源苹果资源

pc软件新闻网络操作系统办公工具编程服务器软件评测

安卓新闻资讯应用教程刷机教程安卓游戏攻略tv资讯深度阅读综合安卓评测

苹果ios资讯苹果手机越狱备份教程美化教程ios软件教程mac教程

单机游戏角色扮演即时战略动作射击棋牌游戏体育竞技模拟经营其它游戏游戏工具

网游cf活动dnf活动lol周免英雄lol礼包

手游最新动态手游评测手游活动新游预告手游问答

您的位置:单机游戏角色扮演 → 怪物猎人世界新装备介绍 怪物猎人世界新装备新系统一览

大唐双龙传_js继承之组合继承(结合原型链继承 和 借用构造函数继承)

标签:舞台上 xpjdz net

在我的前两篇文章中,我们已经介绍了 js 中实现继承的两种模式:原型链继承和借用构造函数继承。这两种模式都存在各自的缺点,所以,我们考虑是否能将这二者结合到一起,从而发挥二者之长。即在继承过程中,既可以保证每个实例都有它自己的属性,又能做到对一些属性和方法的复用。这样就 perfect 了。

一、回顾借用构造函数继承的缺点

先看我们之前在借用构造函数继承中最后用到的代码:

    //父类:人
    function Person () {
      this.head = "脑袋瓜子";
      this.emotion = ["喜", "怒", "哀", "乐"]; //人都有喜怒哀乐
      this.eat = function () {
        console.log("吃吃喝喝");
      }
      this.sleep = function () {
        console.log("睡觉");
      }
      this.run = function () {
        console.log("快跑");
      }
    }
    //子类:学生,继承了“人”这个类
    function Student(studentID) {
      this.studentID = studentID;
      Person.call(this);
    }
    
    //Student.prototype = new Person();

    var stu1 = new Student(1001);
    console.log(stu1.emotion); //["喜", "怒", "哀", "乐"]

    stu1.emotion.push("愁");
    console.log(stu1.emotion); //["喜", "怒", "哀", "乐", "愁"]
    
    var stu2 = new Student(1002);
    console.log(stu2.emotion); //["喜", "怒", "哀", "乐"]

  

  在这段代码中,我们通过借用构造函数继承,保证了 stu1 和 stu2 都有各自的父类属性副本,从而使得各自 emotion 互不影响。但同时带来的问题是,stu1 和 stu2 都拷贝了 Person 类中的所有属性和方法,而在 Person 类中,像 eat ( ), sleep ( ), run ( ) 这类方法应该是公用的,而不需要添加到每个实例上去,增大内存,尤其是这类方法较多的时候。

二、结合使用两种继承模式

  所以我们想到,是否能把这些方法挂载到父类的原型对象上去,实现方法复用,然后子类通过原型链继承,就能调用这些方法啦?~

    //父类:人
    function Pers清华大学_2018年最新新闻网on () {
      this.head = "脑袋瓜子";
      this.emotion = ["喜", "怒", "哀", "乐"]; //人都有喜怒哀乐
    }
    //将 Person 类中需共享的方法放到 prototype 中,实现复用
    Person.prototype.eat = function () {
      console.log("吃吃喝喝");
    }
    Person.prototype.sleep = function () {
      console.log("睡觉");
    }
    Person.prototype.run = function () {
      console.log("快跑");
    }
    //子类:学生,继承了“人”这个类
    function Student(studentID) {
      this.studentID = studentID;
      Per英超_2018年最新新闻网son.call(this);
    }
    
    Student.prototype = new Person();  //此时 Student.prototype 中的 constructor 被重写了,会导致 s铁骨_2018年最新新闻网tu1.constructor === Person
    Student.prototype.constructor = Student;  //将 Student 原型对象的 constructor 指针重新指向 Student 本身

    var stu1 = new Student(1001);
    console.log(stu1.emotion); //["喜", "怒", "哀", "乐"]

    stu1.emotion.push("愁");
    console.log(stu1.emotion);西双版纳_2018年最新新闻网 //["喜", "怒", "哀", "乐", "愁"]
    
    var stu2 = new Student(1002);
    广州大学_2018年最新新闻网console.log(stu2.emotion); //["喜", "

    stu1.eat(); //吃吃喝喝
    stu2.run(); //快跑
    console.log(stu1.constructor);  //Student

  首先,我们将 Person 类中需要复用的方法提取到 Person.prototype 中,然后设置 Student 的原型对象为 Person 类的一个实例,这样 stu1 就能访问到 Person 原型对象上的属性和方法了。其次,为保证 stu1 和 stu2 拥有各自的父类属性副本,我们在 Student 构造函数中,还是使用了 Person.call ( this ) 方法。如此,结合原型链继承和借用构造函数继承,就完美地解决了之前这二者各自表现出来的缺点。

 

如果你觉得文章解决了你的疑惑的话,还请赏我一个推荐哦~ :)

作者不才,文中若有错误,望请指正,避免误人子弟。

文章内容全都参考于《JAVASCRIPT 高级程序设计》第三版)

当前文章:http://kmni8pvke-zaieyi-com.mincomputers.cn/kx6b/55567_154388.html

发布时间:2019-08-22 05:36:09

澳门银河送彩金雷军香港见李嘉诚 长和与小米达成合作  澳门银河送彩金  澳门银河有正规平台吗  澳门银河送彩金雷军香港见李嘉诚 长和与小米达成合作  澳门银河娱乐场yh163am.com  网红流沙手机壳遇尴尬:乘客空乘携带必须走空运  银河娱乐是正规网站吗  银河国际中心游戏厅  澳门银河娱乐yh163am.com  银河娱乐首页yh163am.com  

相关阅读 支付宝内打开淘宝跳转其他App?官方回应:采用了同样URL Scheme美国休斯顿一座化工厂爆炸22人受伤 系阀门损坏所致东京飞香港一载137人客机起飞前机体冒烟,8名乘客不适税延养老险试点进入实操阶段 能给参保者带多大利好?调查显示:微软OneDrive成企业最受欢迎云存储服务北邮经管学院副院长马晓飞:聚焦信息通信互联网与管理教育相融合2018年重庆国际旅游狂欢节下月开幕特斯拉请求美国法院驳回股东诉讼:未夸大Model 3产能

文章评论
发表评论

热门文章 不光微视,腾讯还搞了横屏短视频产品“下饭视频”数百名苹果工程师前往洛杉矶:为未来的iPhone寻找屏幕紫米一款功能机入网工信部:搭载安卓系统股东透露喜马拉雅拟明年上市,喜马拉雅方面否认

最新文章 热干面/葱油面/红油辣面/火鸡面,白象拌乐多干拌面8碗31.8元Python任务调度模块 – APScheduler,Flask-APScheduler实现定时任务 北京物资学院MBA调剂:构建物流流通专业翘楚院校荣耀6月6日两款新机发布:荣耀9i &荣耀Play526京东秒杀精选:Apple Watch低至1388元《狐妖小红娘》漫画274:轻敌的后果就是被反攻吊打

人气排行 京东618竞技装备纪:1元最高可抵618元《生化危机4》HD迎大更新:全景菜单、爆炸效果升级“鹊桥”中继星成功实施近月制动,预计4天后到达地月L2点附近遵守GDPR:部分美国网站屏蔽五亿欧洲居民论软件架构建模技术与应用Windows 10更新四月版Edge浏览器新特性:API升级、扩展插件改善连翘“扶贫花”结满“致富果”派拉蒙官方宣布《变形金刚7》撤档,新档期未定