聊聊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 相关文章推荐
永不消失的title提示代码
Feb 15 Javascript
javascript实现的在当前窗口中漂浮框的代码
Mar 15 Javascript
javascript校验价格合法性实例(必须输入2位小数)
May 05 Javascript
使用jquery动态加载js文件的方法
Dec 24 Javascript
JS实现转动随机数抽奖特效代码
Apr 16 Javascript
jQuery插件制作的实例教程
May 16 Javascript
JS前端加密算法示例
Dec 22 Javascript
浅谈Vuejs Prop基本用法
Aug 17 Javascript
Vue自定义事件(详解)
Aug 19 Javascript
使用vue实现简单键盘的示例(支持移动端和pc端)
Dec 25 Javascript
jQuery实现的记住帐号密码功能完整示例
Aug 03 jQuery
JavaScript实现登录窗体
Jun 22 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
解析在zend Farmework下如何创立一个FORM表单
2013/06/28 PHP
PHP中数据库单例模式的实现代码分享
2014/08/21 PHP
PHP高级编程实例:编写守护进程
2014/09/02 PHP
PHP依赖倒置(Dependency Injection)代码实例
2014/10/11 PHP
用javascript获取地址栏参数
2006/12/22 Javascript
JavaScript 数组循环引起的思考
2010/01/01 Javascript
jquery.validate使用攻略 第三部
2010/07/01 Javascript
找出字符串中出现次数最多的字母和出现次数精简版
2012/11/07 Javascript
Node.js中child_process实现多进程
2015/02/03 Javascript
JavaScript数据绑定实现一个简单的 MVVM 库
2016/04/08 Javascript
JavaScript第一篇之实现按钮全选、功能
2016/08/21 Javascript
详细谈谈AngularJS的子级作用域问题
2016/09/05 Javascript
js内置对象处理_打印学生成绩单的简单实现
2016/09/24 Javascript
Vue.js计算属性computed与watch(5)
2016/12/09 Javascript
Node.js用readline模块实现输入输出
2016/12/16 Javascript
AngularJS自定义指令详解(有分页插件代码)
2017/06/12 Javascript
利用layer实现表单完美验证的方法
2019/09/26 Javascript
nuxt配置通过指定IP和端口访问的实现
2020/01/08 Javascript
云服务器部署Node.js项目的方法步骤(小白系列)
2020/03/23 Javascript
python创建只读属性对象的方法(ReadOnlyObject)
2013/02/10 Python
Django 实现购物车功能的示例代码
2018/10/08 Python
python批量修改图片尺寸,并保存指定路径的实现方法
2019/07/04 Python
python3.6中@property装饰器的使用方法示例
2019/08/17 Python
python dataframe NaN处理方式
2019/12/26 Python
印尼网上商店:Alfacart.com
2019/03/11 全球购物
出纳岗位职责模板
2013/11/27 职场文书
火车的故事教学反思
2014/02/11 职场文书
人力资源经理的岗位职责范本
2014/02/28 职场文书
工厂采购员岗位职责
2014/04/08 职场文书
解除劳动合同协议书(样本)
2014/10/02 职场文书
旗帜观后感
2015/06/08 职场文书
Python 批量下载阴阳师网站壁纸
2021/05/19 Python
详解Redis主从复制实践
2021/05/19 Redis
JUnit5常用注解的使用
2021/07/02 Java/Android
Nginx+Tomcat负载均衡集群的实现示例
2021/10/24 Servers