JS实现面向对象继承的5种方式分析


Posted in Javascript onJuly 21, 2018

本文实例讲述了JS实现面向对象继承的5种方式。分享给大家供大家参考,具体如下:

js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承有以下通用的几种方式

1. 使用对象冒充实现继承(该种实现方式可以实现多继承)

实现原理:让父类的构造函数成为子类的方法,然后调用该子类的方法,通过this关键字给所有的属性和方法赋值

function Parent(firstname)
{
  this.fname=firstname;
  this.age=40;
  this.sayAge=function()
  {
    console.log(this.age);
  }
}
function Child(firstname)
{
  this.parent=Parent;
  this.parent(firstname);
  delete this.parent;
  this.saySomeThing=function()
  {
    console.log(this.fname);
    this.sayAge();
  }
}
var mychild=new Child("李");
mychild.saySomeThing();

2. 采用call方法改变函数上下文实现继承(该种方式不能继承原型链,若想继承原型链,则采用5混合模式)

实现原理:改变函数内部的函数上下文this,使它指向传入函数的具体对象

function Parent(firstname)
{
  this.fname=firstname;
  this.age=40;
  this.sayAge=function()
  {
    console.log(this.age);
  }
}
function Child(firstname)
{
  this.saySomeThing=function()
  {
    console.log(this.fname);
    this.sayAge();
  }
  this.getName=function()
  {
    return firstname;
  }
}
var child=new Child("张");
Parent.call(child,child.getName());
child.saySomeThing();

3. 采用Apply方法改变函数上下文实现继承(该种方式不能继承原型链,若想继承原型链,则采用5混合模式)

实现原理:改变函数内部的函数上下文this,使它指向传入函数的具体对象

function Parent(firstname)
{
  this.fname=firstname;
  this.age=40;
  this.sayAge=function()
  {
    console.log(this.age);
  }
}
function Child(firstname)
{
  this.saySomeThing=function()
  {
    console.log(this.fname);
    this.sayAge();
  }
  this.getName=function()
  {
    return firstname;
  }
}
var child=new Child("张");
Parent.apply(child,[child.getName()]);
child.saySomeThing();

4. 采用原型链的方式实现继承

实现原理:使子类原型对象指向父类的实例以实现继承,即重写类的原型,弊端是不能直接实现多继承

function Parent()
{
  this.sayAge=function()
  {
    console.log(this.age);
  }
}
function Child(firstname)
{
  this.fname=firstname;
  this.age=40;
  this.saySomeThing=function()
  {
    console.log(this.fname);
    this.sayAge();
  }
}
Child.prototype=new Parent();
var child=new Child("张");
child.saySomeThing();

5. 采用混合模式实现继承

function Parent()
{
  this.sayAge=function()
  {
    console.log(this.age);
  }
}
Parent.prototype.sayParent=function()
{
  alert("this is parentmethod!!!");
}
function Child(firstname)
{
  Parent.call(this);
  this.fname=firstname;
  this.age=40;
  this.saySomeThing=function()
  {
    console.log(this.fname);
    this.sayAge();
  }
}
Child.prototype=new Parent();
var child=new Child("张");
child.saySomeThing();
child.sayParent();

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
jQuery UI-Draggable 参数集合
Jan 10 Javascript
JavaScript实现url地址自动检测并添加URL链接示例代码
Nov 12 Javascript
jquery 扑捉回车键事件代码
Apr 24 Javascript
使用AngularJS制作一个简单的RSS阅读器的教程
Jun 18 Javascript
jquery制做精致的倒计时特效
Jun 13 Javascript
jquery hover 不停闪动问题的解决方法(亦为stop()的使用)
Feb 10 Javascript
vue引入微信sdk 实现分享朋友圈获取地理位置功能
Jul 04 Javascript
Vue解析带html标签的字符串为dom的实例
Nov 13 Javascript
vue实现井字棋游戏
Sep 29 Javascript
如何编写一个 Webpack Loader的实现
Oct 18 Javascript
解决Antd Table表头加Icon和气泡提示的坑
Nov 17 Javascript
二维码条形码生成的JavaScript脚本库
Jul 07 Javascript
JavaScript数组基于交换的排序示例【冒泡排序】
Jul 21 #Javascript
vue项目中添加单元测试的方法
Jul 21 #Javascript
基于Vue实现关键词实时搜索高亮显示关键词
Jul 21 #Javascript
jQuery实现的点击按钮改变样式功能示例
Jul 21 #jQuery
jQuery实现输入框的放大和缩小功能示例
Jul 21 #jQuery
jQuery实现table表格信息的展开和缩小功能示例
Jul 21 #jQuery
浅谈vue父子组件怎么传值
Jul 21 #Javascript
You might like
第十三节 对象串行化 [13]
2006/10/09 PHP
php 数组的一个悲剧?
2011/05/11 PHP
如何修改和添加Apache的默认站点目录
2013/07/05 PHP
Document 对象的常用方法
2009/07/31 Javascript
javascript DOM编程实例(智播客学习)
2009/11/23 Javascript
jquery的Theme和Theme Switcher使用小结
2010/09/08 Javascript
jQuery.getScript加载同域JS的代码
2012/02/13 Javascript
JS打印gridview实现原理及代码
2013/02/05 Javascript
JS 跳转页面延迟2种方法
2013/03/29 Javascript
jQuery中dequeue()方法用法实例
2014/12/29 Javascript
JavaScript中用字面量创建对象介绍
2014/12/31 Javascript
EasyUI中实现form表单提交的示例分享
2015/03/01 Javascript
深入理解JavaScript系列(34):设计模式之命令模式详解
2015/03/03 Javascript
JS实现文字放大效果的方法
2015/03/03 Javascript
AngularJS下对数组的对比分析
2016/08/24 Javascript
vue多级多选菜单组件开发
2020/09/08 Javascript
js中apply和Math.max()函数的问题及区别介绍
2018/03/27 Javascript
基于js中的存储键值对以及注意事项介绍
2018/03/30 Javascript
node实现mock-plugin中间件的方法
2019/12/25 Javascript
ES6 Iterator遍历器原理,应用场景及相关常用知识拓展详解
2020/02/15 Javascript
基于Vue中的父子传值问题解决
2020/07/27 Javascript
Python自动连接ssh的方法
2015/03/07 Python
Python获取任意xml节点值的方法
2015/05/05 Python
在Mac OS上搭建Python的开发环境
2015/12/24 Python
简单掌握Python中glob模块查找文件路径的用法
2016/07/05 Python
numpy求平均值的维度设定的例子
2019/08/24 Python
Pandas数据离散化原理及实例解析
2019/11/16 Python
Python 中的pygame安装与配置教程详解
2020/02/10 Python
python+OpenCV实现图像拼接
2020/03/05 Python
Daisy London官网:英国最大的首饰集团IBB旗下
2019/02/28 全球购物
C语言笔试集
2012/07/24 面试题
医院辞职信范文
2014/01/17 职场文书
教育英语专业毕业生的求职信
2014/03/13 职场文书
幼儿园教师心得体会范文
2016/01/21 职场文书
分析SQL窗口函数之取值窗口函数
2022/04/21 Oracle
详解Android中的TimePickerView(时间选择器)的用法
2022/04/30 Java/Android