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 相关文章推荐
一个简单的弹性返回顶部JS代码实现介绍
Jun 09 Javascript
javascript获取flash版本号的方法
Nov 20 Javascript
node.js中的fs.writeFile方法使用说明
Dec 14 Javascript
JavaScript设置表单上传时文件个数的方法
Aug 11 Javascript
jQuery实现滑动页面固定顶部显示(可根据显示位置消失与替换)
Oct 28 Javascript
Angularjs中的事件广播 —全面解析$broadcast,$emit,$on
May 17 Javascript
JS定时器使用,定时定点,固定时刻,循环执行详解
May 31 Javascript
jQuery插件HighCharts绘制2D半圆环图效果示例【附demo源码下载】
Mar 09 Javascript
Vue 进阶教程之v-model详解
May 06 Javascript
Vue scrollBehavior 滚动行为实现后退页面显示在上次浏览的位置
May 27 Javascript
详解Vue中的基本语法和常用指令
Jul 23 Javascript
微信小程序canvas分享海报功能
Oct 31 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
第一节--面向对象编程
2006/11/16 PHP
url decode problem 解决方法
2011/12/26 PHP
探讨:如何编写PHP扩展
2013/06/13 PHP
PHP中is_file不能替代file_exists的理由
2014/03/04 PHP
PHP goto语句简介和使用实例
2014/03/11 PHP
PHP实现获取图片颜色值的方法
2014/07/11 PHP
Laravel 5框架学习之Blade 简介
2015/04/08 PHP
PHP HTTP 认证实例详解
2016/11/03 PHP
PHP内置函数生成随机数实例
2019/01/18 PHP
[原创]后缀就扩展名为js的文件是什么文件
2007/12/06 Javascript
JQuery 表单中textarea字数限制实现代码
2009/12/07 Javascript
常见浏览器多长时间会提示“脚本运行时间过长”总结
2014/04/29 Javascript
浅析Bootstrap组件之面板组件
2016/05/04 Javascript
three.js绘制地球、飞机与轨迹的效果示例
2017/02/28 Javascript
ES6 javascript的异步操作实例详解
2017/10/30 Javascript
基于vue-simplemde实现图片拖拽、粘贴功能
2018/04/12 Javascript
Vue不能观察到数组length的变化
2018/06/08 Javascript
JavaScript实现连连看连线算法
2019/01/05 Javascript
js操作两个json数组合并、去重,以及删除某一项元素
2020/09/22 Javascript
NodeJS和浏览器中this关键字的不同之处
2021/03/03 NodeJs
[48:02]Ti4循环赛第三日 VG vs Liquid和NEWBEE vs DK
2014/07/12 DOTA
python操作CouchDB的方法
2014/10/08 Python
Nginx搭建HTTPS服务器和强制使用HTTPS访问的方法
2015/08/16 Python
python实现k-means聚类算法
2018/02/23 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
2019/02/18 Python
解决pycharm remote deployment 配置的问题
2019/06/27 Python
python实现图像全景拼接
2020/03/27 Python
为什么是 Python -m
2020/06/19 Python
Python的logging模块基本用法
2020/12/24 Python
HTML5制作酷炫音频播放器插件图文教程
2014/12/30 HTML / CSS
迪梵英国官方网站:Darphin英国
2017/12/06 全球购物
幼儿园教师教育感言
2014/02/28 职场文书
劳资员岗位职责
2015/02/13 职场文书
单位车辆管理制度
2015/08/05 职场文书
2016思想纪律作风整顿心得体会
2016/01/23 职场文书
Tomcat弱口令复现及利用
2022/05/06 Servers