聊聊JavaScript如何实现继承及特点


Posted in Javascript onApril 07, 2017

“继承”是面向对象编程里面经常提及到的概念,它的目的是实现代码复用。JavaScript并没有“类”的概念,那么,它如何实现继承呢?

(ES6有关键字class和extend,继承的语法与Java等面向对象语言类似,但是,ES6 class,只是JavaScript原型继承的语法糖而已)

1. 类式继承

关键点:通过构造函数实现继承。

父类:

function Parent(name) {
 this.name = name || "parent";
}
Parent.prototype.say = function() {
 return this.name;
}

子类:

function Child() {}

(1) 父类对象继承

Child.prototype = new Parent("child");

var child = new Child();
child.say(); // "child"

特点:使用这种继承模式,子类不仅仅会继承父类原型上的方法/属性,还会继承父类自身的属性。

这种模式的缺点是,在初始化父类对象指向给子类原型时,并不确定父类构造函数的初始化参数(Child.prototype = new Parent("child");),而且,往往这些参数并不是子类需要的。

(2) 借用构造函数

改造子类:

function Child(){
 Parent.apply(this, arguments);
}

特点:使用这种继承模式,子类只会继承父类自身的属性。

缺点很明显,它无法从原型链中继承任何方法/属性。

(3) 共享原型

Child.prototype = Parent.prototype;

这种方式的缺点是,子类原型和父类原型共享一个对象,那么,子类如果修改原型,必然会影响父类。

(4) 临时构造函数

function inherit(Child, Parent) {
 var F = function(){};
 F.prototype = Parent.prototype;
 Child.prototype = new F();
}

特点:利用一个空函数F()充当子类和父类之间的代理,既可以实现父类原型方法/属性的继承,又可以在子类原型上继续扩展方法/属性。

一般,我们可以利用ES5提供的新方法Object.create()来实现此类继承。

Child.prototype = Object.create(Parent.prototype);

2. 通过复制属性实现继承

复制属性分为浅拷贝深拷贝

浅拷贝不会复制对象类型,只会简单的将对象引用指向子类,代码如下:

function extend(parent, child) {
 var key;
 for(key in parent) {
  if (parent.hasOwnProperty(key)){
   child[key] = parent[key];
  }
 }
 return child;
}

深拷贝会做深度复制,如果某个属性为对象类型,那么,它会复制出该对象的属性,再拷贝给子类。代码如下:

function extendDeep(parent, child) {
 var key;
 for(key in parent) {
  if (parent.hasOwnProperty(key)){
   if (typeof parent[key] === 'object') {
    child[key] = (parent[key].toString() === "[object Array]")? []:{};
    extendDeep(parent[key], child[key]);
   } else {
    child[key] = parent[key];
   }
  }
 }
 return child;
}

3. "借用方法"模式复用父类函数

如果不想实现父子之间的完全继承,仅仅期望子类实现父类中一个或多个方法,那么可以利用apply, call, bind来调用父类函数,实现复用。

代码如下:

parent.say.call(child, "hello, child!");

小结

推荐采用“临时构造函数”模式实现继承。以上所述是小编给大家介绍的JavaScript如何实现继承,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
Ruffy javascript 学习笔记
Nov 30 Javascript
JavaScript判断一个URL链接是否有效的实现方法
Oct 08 Javascript
JavaScript运行过程中的“预编译阶段”和“执行阶段”
Dec 16 Javascript
JavaScript lodash常见用法系列小结
Aug 24 Javascript
Angular 4依赖注入学习教程之InjectToken的使用(八)
Jun 04 Javascript
JavaScript实现的原生态兼容IE6可调可控滚动文字功能详解
Sep 19 Javascript
vue源码学习之Object.defineProperty对象属性监听
May 30 Javascript
详解React项目如何修改打包地址(编译输出文件地址)
Mar 21 Javascript
javascript实现blob加密视频源地址的方法
Aug 08 Javascript
JavaScript中this的学习笔记及用法整理
Feb 17 Javascript
webpack3.0升级4.0的方法步骤
Apr 02 Javascript
浅谈vue2的$refs在vue3组合式API中的替代方法
Apr 18 Vue.js
js简单实现网页换肤功能
Apr 07 #Javascript
JS简单实现获取元素的封装操作示例
Apr 07 #Javascript
Bootstrap.css与layDate日期选择样式起冲突的解决办法
Apr 07 #Javascript
JS实现的添加弹出层并完成锁屏操作示例
Apr 07 #Javascript
JavaScript函数节流的两种写法
Apr 07 #Javascript
原生JS实现圆环拖拽效果
Apr 07 #Javascript
Zepto实现密码的隐藏/显示
Apr 07 #Javascript
You might like
百度实时推送api接口应用示例
2014/10/21 PHP
Sublime里直接运行PHP配置方法
2014/11/28 PHP
关于Curl在Swoole协程中的解决方案详析
2019/09/12 PHP
JS 获取span标签中的值的代码 支持ie与firefox
2009/08/24 Javascript
javascript中的onkeyup和onkeydown区别介绍
2013/04/28 Javascript
jquery ready(fn)事件使用介绍
2013/08/21 Javascript
JS+JSP checkBox 全选具体实现
2014/01/02 Javascript
Jquery Ajax xmlhttp请求成功问题
2015/02/04 Javascript
jquery中ajax使用error调试错误的方法
2015/02/08 Javascript
JavaScript跨浏览器获取页面中相同class节点的方法
2015/03/03 Javascript
JavaScript中判断两个字符串是否相等的方法
2015/07/07 Javascript
jQuery实现文本框邮箱输入自动补全效果
2015/11/17 Javascript
基于JS判断iframe是否加载成功的方法(多种浏览器)
2016/05/13 Javascript
Angular通过angular-cli来搭建web前端项目的方法
2017/07/27 Javascript
vue-cli配置文件——config篇
2018/01/04 Javascript
Node.js中DNS模块学习总结
2018/02/28 Javascript
vue 路由嵌套高亮问题的解决方法
2018/05/17 Javascript
基于element-ui组件手动实现单选和上传功能
2018/12/06 Javascript
JS实现的图片选择顺序切换和循环切换功能示例【测试可用】
2018/12/28 Javascript
从0到1搭建element后台框架优化篇(打包优化)
2019/05/12 Javascript
微信小程序实现列表的横向滑动方式
2020/07/15 Javascript
vuex中store存储store.commit和store.dispatch的用法
2020/07/24 Javascript
jquery实现拖拽添加元素功能
2020/12/01 jQuery
[01:46]新英雄登场
2019/09/10 DOTA
python中pycurl库的用法实例
2014/09/30 Python
解析Python中的生成器及其与迭代器的差异
2016/06/20 Python
Django框架模板注入操作示例【变量传递到模板】
2018/12/19 Python
python 计算平均平方误差(MSE)的实例
2019/06/29 Python
土耳其时尚购物网站:Morhipo
2017/09/04 全球购物
夏威夷灵感服装及配饰:Reyn Spooner
2018/09/18 全球购物
高分子材料个人求职信范文
2013/09/25 职场文书
公司担保书格式范文
2014/05/12 职场文书
2015年端午节活动策划书
2015/05/05 职场文书
保险公司增员口号
2015/12/25 职场文书
vue项目两种方式实现竖向表格的思路分析
2021/04/28 Vue.js
解决MySQL报“too many connections“错误
2022/04/19 MySQL