聊聊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 相关文章推荐
在b/s开发中经常用到的javaScript技术
Aug 23 Javascript
De facto standard 世界上不可思议的事实标准
Aug 29 Javascript
js对文章内容进行分页示例代码
Mar 05 Javascript
什么是Node.js?Node.js详细介绍
Jun 01 Javascript
jQuery实现数字加减效果汇总
Dec 16 Javascript
javascript实现网页背景烟花效果的方法
Aug 06 Javascript
关于AngularJs数据的本地存储详解
Jan 20 Javascript
微信小程序 图片宽度自适应的实现
Apr 06 Javascript
Vue中render函数的使用方法
Jan 31 Javascript
详解angularjs跨页面传参遇到的一些问题
Nov 01 Javascript
小程序websocket心跳库(websocket-heartbeat-miniprogram)
Feb 23 Javascript
浅谈Vue3.0新版API之composition-api入坑指南
Apr 30 Javascript
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
我的群发邮件程序
2006/10/09 PHP
PHP实现小偷程序实例
2016/10/31 PHP
PHP array_shift()用法实例分析
2019/01/07 PHP
破除一些网站复制、右键限制
2006/11/04 Javascript
jquery select操作的日期联动实现代码
2009/12/06 Javascript
基于jquery的一个浮动框(扩展性比较好 )
2010/08/27 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
2014/12/10 Javascript
Eclipse配置Javascript开发环境图文教程
2015/01/29 Javascript
JS和css实现检测移动设备方向的变化并判断横竖屏幕
2015/05/25 Javascript
Vue.js 2.0 和 React、Augular等其他前端框架大比拼
2016/10/08 Javascript
Nodejs实现多房间简易聊天室功能
2017/06/20 NodeJs
详解Koa中更方便简单发送响应的方式
2018/07/20 Javascript
JavaScript实现图片轮播特效
2019/10/23 Javascript
巧用Python装饰器 免去调用父类构造函数的麻烦
2012/05/18 Python
Python开发常用的一些开源Package分享
2015/02/14 Python
Python的Flask框架中集成CKeditor富文本编辑器的教程
2016/06/13 Python
Python中的变量和作用域详解
2016/07/13 Python
Django网络框架之创建虚拟开发环境操作示例
2019/06/06 Python
python通过txt文件批量安装依赖包的实现步骤
2019/08/13 Python
CSS3属性box-sizing使用指南
2014/12/09 HTML / CSS
CSS3 :not()选择器实现最后一行li去除某种css样式
2016/10/19 HTML / CSS
Charlotte Tilbury英国官网:英国彩妆品牌
2017/05/26 全球购物
蔻驰法国官网:COACH法国
2018/11/14 全球购物
自我鉴定范文300字
2013/10/01 职场文书
行政管理人员精品工作推荐信
2013/11/04 职场文书
优秀社区干部事迹材料
2014/02/03 职场文书
办公自动化专业大学生职业规划书
2014/03/06 职场文书
行政内勤岗位职责
2014/04/07 职场文书
开学寄语大全
2014/04/08 职场文书
写给医院的感谢信
2015/01/22 职场文书
稽核岗位职责范本
2015/04/13 职场文书
2019大学生社会实践报告汇总
2019/08/16 职场文书
《西游记》读后感(3篇)
2019/09/20 职场文书
python实现三阶魔方还原的示例代码
2021/04/28 Python
Python 内置函数速查表一览
2021/06/02 Python
浅谈MySQL 亿级数据分页的优化
2021/06/15 MySQL