[js高手之路]寄生组合式继承的优势详解


Posted in Javascript onAugust 28, 2017

在之前javascript面向对象系列的文章里面,我们已经探讨了组合继承和寄生继承,回顾下组合继承:

function Person( uName ){
      this.skills = [ 'php', 'javascript' ];
      this.userName = uName;
    }
    Person.prototype.showUserName = function(){
      return this.userName;
    }
    function Teacher ( uName ){
      Person.call( this, uName );
    }
    Teacher.prototype = new Person();

    var oT1 = new Teacher( 'ghostwu' );
    oT1.skills.push( 'linux' );
    var oT2 = new Teacher( 'ghostwu' );
    console.log( oT2.skills ); //php,javascript
    console.log( oT2.showUserName() ); //ghostwu

组合继承有个缺点,父类的构造函数会被调用两次.

第11行,设置子类原型对象(prototype),调用了第一次

第9行,实例化对象的时候,又调用一次

构造函数的目的是为了复制属性,第9行肯定是不能少的,第11行的目的是为了获取到父类原型对象(prototype)上的方法,基于这个目的,有没有别的方法

可以做到 在不需要实例化父类构造函数的情况下,也能得到父类原型对象上的方法呢? 当然可以,我们可以采用寄生式继承来得到父类原型对象上的方法

function Person( uName ){
      this.skills = [ 'php', 'javascript' ];
      this.userName = uName;
    }
    Person.prototype.showUserName = function(){
      return this.userName;
    }
    function Teacher ( uName ){
      Person.call( this, uName );
    }

    function object( o ){
      var G = function(){};
      G.prototype = o;
      return new G();
    }

    function inheritPrototype( subObj, superObj ){
      var proObj = object( superObj.prototype ); //复制父类superObj的原型对象
      proObj.constructor = subObj; //constructor指向子类构造函数
      subObj.prototype = proObj; //再把这个对象给子类的原型对象
    }

    inheritPrototype( Teacher, Person );

    var oT1 = new Teacher( 'ghostwu' );
    oT1.skills.push( 'linux' );
    var oT2 = new Teacher( 'ghostwu' );
    console.log( oT2.skills ); //php,javascript
    console.log( oT2.showUserName() ); //ghostwu

其实,说白了寄生组合式继承就是一个借用构造函数 + 相当于浅拷贝父类的原型对象

以上这篇[js高手之路]寄生组合式继承的优势详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery异步调用页面后台方法‏(asp.net)
Mar 01 Javascript
JavaScript中的公有、私有、特权和静态成员用法分析
Nov 20 Javascript
js函数与php函数的区别实例浅析
Jan 12 Javascript
jQuery Validate验证框架经典大全
Sep 23 Javascript
基于MVC4+EasyUI的Web开发框架形成之旅之界面控件的使用
Dec 16 Javascript
jQuery实现的鼠标滑过弹出放大图片特效
Jan 08 Javascript
微信小程序 聊天室简单实现
Apr 19 Javascript
JavaScript实现多张图片放大镜效果示例【不限定图片尺寸,rem单位】
May 14 Javascript
js+html实现周岁年龄计算器
Jun 25 Javascript
layer.js open 隐藏滚动条的例子
Sep 05 Javascript
解决微信授权成功后点击按返回键出现空白页和报错的问题
Jun 08 Javascript
vue开发chrome插件,实现获取界面数据和保存到数据库功能
Dec 01 Vue.js
ajax+node+request爬取网络图片的实例(宅男福利)
Aug 28 #Javascript
js排序与重组的实例讲解
Aug 28 #Javascript
利用ES6的Promise.all实现至少请求多长时间的实例
Aug 28 #Javascript
JS自定义函数实现时间戳转换成date的方法示例
Aug 27 #Javascript
JavaScript学习笔记之惰性函数示例详解
Aug 27 #Javascript
Vue实现typeahead组件功能(非常靠谱)
Aug 26 #Javascript
vue下跨域设置的相关介绍
Aug 26 #Javascript
You might like
php.ini 配置文件的深入解析
2013/06/17 PHP
使用PHP Socket写的POP3类
2013/10/30 PHP
php生成N个不重复的随机数实例
2013/11/12 PHP
PHP内置过滤器FILTER使用实例
2014/06/25 PHP
PHP读取汉字的点阵数据
2015/06/22 PHP
深入理解PHP内核(一)
2015/11/10 PHP
php中array_column函数简单实现方法
2016/07/11 PHP
关于ThinkPHP中的异常处理详解
2018/05/11 PHP
PHP使用openssl扩展实现加解密方法示例
2020/02/20 PHP
Dom加载让图片加载完再执行的脚本代码
2008/05/15 Javascript
Javascript 判断客户端浏览器类型代码
2010/03/01 Javascript
再论Javascript下字符串连接的性能
2011/03/05 Javascript
js 实现在离开页面时提醒未保存的信息(减少用户重复操作)
2013/01/16 Javascript
JavaScript 垃圾回收机制分析
2013/10/10 Javascript
基于jQuery 实现bootstrapValidator下的全局验证
2015/12/07 Javascript
JavaScript事件 "事件对象"的注意要点
2016/01/14 Javascript
JS实现的打字机效果完整实例
2016/06/20 Javascript
jQuery插件扩展实例【添加回调函数】
2016/11/26 Javascript
JavaScript创建对象的常用方式总结
2018/08/10 Javascript
javascript for循环性能测试示例
2019/08/07 Javascript
微信小程序使用蓝牙小插件
2019/09/23 Javascript
vue-socket.io接收不到数据问题的解决方法
2020/05/13 Javascript
如何用JS模拟实现数组的map方法
2020/07/30 Javascript
vue3.0 项目搭建和使用流程
2021/03/04 Vue.js
python练习程序批量修改文件名
2014/01/16 Python
python中__call__方法示例分析
2014/10/11 Python
详解Python中的元组与逻辑运算符
2015/10/13 Python
python 检查是否为中文字符串的方法
2018/12/28 Python
python实现Dijkstra算法的最短路径问题
2019/06/21 Python
解决reload(sys)后print失效的问题
2020/04/25 Python
HTML5 progress和meter控件_动力节点Java学院整理
2017/07/06 HTML / CSS
中东最大的在线宠物店:Dubai Pet Food
2020/06/11 全球购物
村委会换届选举方案
2014/05/03 职场文书
Python手拉手教你爬取贝壳房源数据的实战教程
2021/05/21 Python
sql字段解析器的实现示例
2021/06/23 SQL Server
MySQL分区以及建索引的方法总结
2022/04/13 MySQL