聊聊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 相关文章推荐
用js怎么把&字符换成"&amp:"
Oct 19 Javascript
网络之美 JavaScript中Get和Set访问器的实现代码
Sep 19 Javascript
js操作textarea 常用方法总结
Dec 03 Javascript
jquery实现点击TreeView文本父节点展开/折叠子节点
Jan 10 Javascript
JS获取单击按钮单元格所在行的信息
Jun 17 Javascript
深入理解事件冒泡(Bubble)和事件捕捉(capture)
May 28 Javascript
Bootstarp基本模版学习教程
Feb 01 Javascript
打字效果动画的4种实现方法(超简单)
Oct 18 Javascript
Vue项目全局配置页面缓存之按需读取缓存的实现详解
Aug 01 Javascript
对Vue2 自定义全局指令Vue.directive和指令的生命周期介绍
Aug 30 Javascript
js 压缩图片的示例(只缩小体积,不更改图片尺寸)
Oct 21 Javascript
如何封装Vue Element的table表格组件
Feb 06 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
php 各种应用乱码问题的解决方法
2010/05/09 PHP
php生成的html meta和link标记在body标签里 顶部有个空行
2010/05/18 PHP
PHP三层结构(上) 简单三层结构
2010/07/04 PHP
解决cPanel无法安装php5.2.17
2014/06/22 PHP
php开启与关闭错误提示适用于没有修改php.ini的权限
2014/10/16 PHP
dedecms中使用php语句指南
2014/11/13 PHP
yii2局部关闭(开启)csrf的验证的实例代码
2017/07/10 PHP
JS预览图像将本地图片显示到浏览器上
2013/08/25 Javascript
使用jquery局部刷新(jquery.load)从数据库取出数据
2014/01/22 Javascript
JS获取下拉框显示值和判断单选按钮的方法
2015/07/09 Javascript
跟我学习javascript的prototype,getPrototypeOf和__proto__
2015/11/17 Javascript
AngularJS 中的指令实践开发指南(一)
2016/03/20 Javascript
AngularJS实现分页显示数据库信息
2016/07/01 Javascript
Bootstrap框架安装使用详解
2017/01/21 Javascript
JS数组操作之增删改查的简单实现
2017/08/21 Javascript
使用express搭建一个简单的查询服务器的方法
2018/02/09 Javascript
一次Webpack配置文件的分离实战记录
2018/11/30 Javascript
JQueryDOM之样式操作
2019/03/27 jQuery
一篇文章介绍redux、react-redux、redux-saga总结
2019/05/23 Javascript
Node.js HTTP服务器中的文件、图片上传的方法
2019/09/23 Javascript
Python爬虫利用cookie实现模拟登陆实例详解
2017/01/12 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
2018/04/22 Python
Selenium(Python web测试工具)基本用法详解
2018/08/10 Python
pytorch 更改预训练模型网络结构的方法
2019/08/19 Python
jupyter notebook插入本地图片的实现
2020/04/13 Python
python3.8动态人脸识别的实现示例
2020/09/21 Python
python在linux环境下安装skimage的示例代码
2020/10/14 Python
如何编写python的daemon程序
2021/01/07 Python
孕妇内衣和胸罩:Cake Maternity
2018/07/16 全球购物
Belstaff英国官方在线商店:Belstaff.co.uk
2021/02/09 全球购物
俄罗斯品牌服装和鞋子在线商店:BRIONITY
2020/03/26 全球购物
后勤岗位职责
2013/11/26 职场文书
学习雷锋精神演讲稿
2014/05/10 职场文书
秋季运动会演讲稿
2014/09/16 职场文书
Redis延迟队列和分布式延迟队列的简答实现
2021/05/13 Redis
详解CSS伪元素的妙用单标签之美
2021/05/25 HTML / CSS