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 相关文章推荐
JavaScript入门教程(12) js对象化编程
Jan 31 Javascript
浅析JS刷新框架中的其他页面 && JS刷新窗口方法汇总
Jul 08 Javascript
JavaScript获取图片的原始尺寸以宽度为例
May 04 Javascript
js中通过父级进行查找定位元素
Jun 15 Javascript
jQuery实现表单提交时判断的方法
Dec 13 Javascript
BootStrap Datepicker 插件修改为默认中文的实现方法
Feb 10 Javascript
纯JavaScript实现实时反馈系统时间
Oct 26 Javascript
AngularJs用户输入动态模板XSS攻击示例详解
Apr 21 Javascript
vue使用v-for实现hover点击效果
Sep 29 Javascript
vue中tab选项卡的实现思路
Nov 25 Javascript
JS中注入eval, Function等系统函数截获动态代码
Apr 03 Javascript
element-ui 中使用upload多文件上传只请求一次接口
Jul 19 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
3.从实例开始
2006/10/09 PHP
eWebEditor v3.8 商业完整版 (PHP)
2006/12/06 PHP
PHP执行SQL文件并将SQL文件导入到数据库
2015/09/17 PHP
深入浅析安装PhpStorm并激活的步骤详解
2020/09/17 PHP
解决AJAX中跨域访问出现'没有权限'的错误
2008/08/20 Javascript
jQuery 动画基础教程
2008/12/25 Javascript
jquery动态加载js三种方法实例
2013/08/03 Javascript
javascript实现仿腾讯游戏选择
2015/05/14 Javascript
原生JS实现网络彩票投注效果
2016/09/25 Javascript
原生js代码实现图片放大境效果
2016/10/30 Javascript
详解微信小程序——自定义圆形进度条
2016/12/29 Javascript
Vue监听数据对象变化源码
2017/03/09 Javascript
阿里大于短信验证码node koa2的实现代码(最新)
2017/09/07 Javascript
解决vue项目nginx部署到非根目录下刷新空白的问题
2018/09/27 Javascript
微信小程序云开发之使用云数据库
2019/05/17 Javascript
Vue+ElementUI项目使用webpack输出MPA的方法
2019/08/27 Javascript
浅谈vue中document.getElementById()拿到的是原值的问题
2020/07/26 Javascript
Python2.6版本中实现字典推导 PEP 274(Dict Comprehensions)
2015/04/28 Python
python实现mysql的单引号字符串过滤方法
2015/11/14 Python
Python编程pygal绘图实例之XY线
2017/12/09 Python
python使用Pycharm创建一个Django项目
2018/03/05 Python
Pandas 数据处理,数据清洗详解
2018/07/10 Python
python 内置函数汇总详解
2019/09/16 Python
pygame实现贪吃蛇游戏(上)
2019/10/29 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
2020/10/18 Python
CSS实现圆形放大镜狙击镜效果 只有圆圈里的放大
2012/12/10 HTML / CSS
HTML5新标签兼容——> 的两种方法
2018/09/12 HTML / CSS
80年代复古T恤:TruffleShuffle
2018/07/02 全球购物
求职简历自荐信
2013/10/20 职场文书
大学生专业个人学习的自我评价
2013/10/26 职场文书
继电保护工岗位职责
2014/01/05 职场文书
美食节目策划方案
2014/05/31 职场文书
法人单位授权委托书范文
2014/10/06 职场文书
Filebeat 采集 Nginx 日志的方法
2021/03/31 Servers
如何在CocosCreator里画个炫酷的雷达图
2021/04/16 Javascript
redis数据结构之压缩列表
2022/03/21 Redis