聊聊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 相关文章推荐
IE 上下滚动展示模仿Marquee机制
Dec 20 Javascript
js查看一个函数的执行时间实例代码
Sep 12 Javascript
基于JS实现弹出一个隐藏的div窗口body页面变成灰色并且不可被编辑
Dec 14 Javascript
基于jQuery实现左侧菜单栏可折叠功能
Dec 27 Javascript
vue2滚动条加载更多数据实现代码
Jan 10 Javascript
尝试自己动手用react来写一个分页组件(小结)
Feb 09 Javascript
vue移动端下拉刷新和上拉加载的实现代码
Sep 08 Javascript
H5+C3+JS实现双人对战五子棋游戏(UI篇)
May 28 Javascript
django使用channels2.x实现实时通讯
Nov 28 Javascript
vue生命周期与钩子函数简单示例
Mar 13 Javascript
vue-cli中使用高德地图的方法示例
Mar 28 Javascript
使用vue制作滑动标签
Sep 21 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
Search Engine Friendly的URL设计
2006/10/09 PHP
php实现session自定义会话处理器的方法
2015/01/27 PHP
对laravel的session获取与存取方法详解
2019/10/08 PHP
解决Laravel 不能创建 migration 的问题
2019/10/09 PHP
使用JavaScript switch case 另类写法
2010/03/14 Javascript
javascript 当前日期转化为中文的实现代码
2010/05/13 Javascript
基于jquery的$.ajax async使用
2011/10/19 Javascript
完美解决linux下node.js全局模块找不到的情况
2018/05/16 Javascript
jQuery获取随机颜色的实例代码
2018/05/21 jQuery
AngularJS自定义表单验证功能实例详解
2018/08/24 Javascript
vue + node如何通过一个Txt文件批量生成MP3并压缩成Zip
2020/06/02 Javascript
Python批量创建迅雷任务及创建多个文件
2016/02/13 Python
python numpy函数中的linspace创建等差数列详解
2017/10/13 Python
python中文分词,使用结巴分词对python进行分词(实例讲解)
2017/11/14 Python
1 行 Python 代码快速实现 FTP 服务器
2018/01/25 Python
Django 浅谈根据配置生成SQL语句的问题
2018/05/29 Python
python接口自动化测试之接口数据依赖的实现方法
2019/04/26 Python
Python如何爬取微信公众号文章和评论(基于 Fiddler 抓包分析)
2019/06/28 Python
python提取xml里面的链接源码详解
2019/10/15 Python
python和php哪个容易学
2020/06/19 Python
详解python方法之绑定方法与非绑定方法
2020/08/17 Python
python 如何区分return和yield
2020/09/22 Python
HTML5实现文件断点续传的方法
2017/01/04 HTML / CSS
武汉某公司的C#笔试题面试题
2015/12/25 面试题
质检部岗位职责
2013/11/11 职场文书
心理学专业大学生职业生涯规划范文
2014/02/19 职场文书
绿色城市实施方案
2014/03/19 职场文书
合作意向书格式及范文
2014/03/31 职场文书
讲解员培训方案
2014/05/04 职场文书
酒店财务部岗位职责
2015/04/14 职场文书
英文辞职信范文
2015/05/13 职场文书
2016年小学生寒假家长评语
2015/10/10 职场文书
六年级数学教学反思
2016/02/16 职场文书
物业管理交接协议书
2016/03/24 职场文书
三种方式清除vue路由跳转router-link的历史记录
2022/04/10 Vue.js
Python 文字识别
2022/05/11 Python