JS实现继承的几种常用方式示例


Posted in Javascript onJune 22, 2019

本文实例讲述了JS实现继承的几种常用方式。分享给大家供大家参考,具体如下:

1,原型链继承

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>原型链继承</title>
</head>
<body>
<script>
  /**
   * 优点:
   * 实例是父类的实例也是子类的实例
   * 父类新增原型方法或者原型属性 子类都能访问到
   * 简单 易于实现
   * 缺点:
   * 无法实现多继承
   * 来自原型对象的引用属性和实例是所有子类共享的
   * 创建子类实例的时候,无法向父构造函数传参
   * 可以在Cat构造函数中,为Cat实例增加实例属性。如果要新增原型属性和方法,则必须放在new Animal()这样的语句之后执行。
   * **/
  function Animal(name) {
    this.name=name;//属性
    this.sleep=function () {//实例方法
      console.log(this.name+'正在睡觉')
    }
  }
  //原型方法
  Animal.prototype.eat=function (food) {
    console.log(this.name+'正在吃'+food)
  };
  //原型链继承---核心:将父类的实例作为子类的原型
  function Cat() {
  }
  Cat.prototype=new Animal();
  Cat.prototype.name='cat';
  var cat=new Cat();
  console.log(cat);//cat._proto_====>Animal 可以使用Animal里面的name属性 sleep方法
  //  也可以使用 cat._proto_._proto_的eat方法 即animal的原型方法
  //  cat._proto_._proto_._proto_ 是object
  console.log(cat.name);
  cat.eat('fish');
  cat.sleep();
</script>
</body>
</html>

运行结果:

JS实现继承的几种常用方式示例

2,构造继承

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>构造继承</title>
</head>
<body>
<script>
  /**
   *构造继承 相当于复制父类的实例给子类 (没有用到原型)
   * 只能使用父类的属性和方法 不能继承原型属性和方法 所以cat不能使用eat方法
   * **/
  function Animal(name) {
    this.name=name;//属性
    this.sleep=function () {//实例方法
      console.log(this.name + '正在睡觉!');
    }
  }
  // 原型方法
  Animal.prototype.eat = function(food) {
    console.log(this.name + '正在吃:' + food);
  };
  function Cat(name) {
    Animal.call(this,name);//Cat就可以使用Animal的
//    this.name=name
  }
  var cat=new Cat('Tom');
  console.log(cat);//只能使用Animal的属性和实例方法 不能使用原型的方法
  //cat的_proto_(指向的是一个函数) 是cat 构造器是Cat cat的_proto_._proto_ 是object
  console.log(cat.name);
//  cat.eat('fish');
  cat.sleep()
</script>
</body>
</html>

运行结果:

JS实现继承的几种常用方式示例

3,组合继承

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>组合继承</title>
</head>
<body>
<script>
  function Animal(name) {
    this.name=name;
    this.sleep=function () {
      console.log(this.name+"正在睡觉");
    };
  }
  Animal.prototype.eat=function (food) {
    console.log(this.name+"正在吃"+food);
  }
  function Cat(name) {
    Animal.call(this,name)
  }
  Cat.prototype=new Animal();
//  组合继承也是需要修复构造函数指向的。
  Cat.prototype.constructor=Cat;//构造器进行修改
  Cat.prototype.show=function () {//可以在子类的原型上加方法 不影响父类
    console.log("11111")
  };
  var cat=new Cat('Tom');
  console.log(cat);//cat可以直接使用animal的属性和实例方法
  //cat.proto是Animal cat.proto_._proto_ 是eat cat.proto_._proto_._proto_是object
  console.log(cat.name);
  cat.sleep();
  cat.eat('fish')
  cat.show()
</script>
</body>
</html>

运行结果:

JS实现继承的几种常用方式示例

4,寄生组合继承

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>寄生组合继承</title>
</head>
<body>
<script>
  function Animal(name) {
    this.name=name;
    this.sleep=function () {
      console.log(this.name+"正在睡觉");
    }
  }
  // 原型方法
  Animal.prototype.eat = function(food) {
    console.log(this.name + '正在吃:' + food);
  };
  function Cat(name) {
    Animal.call(this,name);
  }
//  (function () {
    //创建一个没有实例方法的类
    var Super=function () {
    };
    Super.prototype=Animal.prototype;//eat
    console.log(Animal.prototype);//构造方法还是Animal 可以使用eat方法 eat的_proto_ 是object
    //初始化这个实例 把它作为子类(Cat)的原型
    Cat.prototype=new Super();//一般 的话是new Animal()
    Cat.prototype.constructor=Cat;//Cat的构造器还是Cat
//  })();
  var cat=new Cat('Tom');
  console.log(cat.name);
  cat.sleep();
  cat.eat('food')
</script>
</body>
</html>

运行结果:

JS实现继承的几种常用方式示例

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

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

Javascript 相关文章推荐
filters.revealTrans.Transition使用方法小结
Aug 19 Javascript
JavaScript正则表达式的分组匹配详解
Feb 13 Javascript
jQuery使用zTree插件实现树形菜单和异步加载
Feb 25 Javascript
JS正则表达式学习之贪婪和非贪婪模式实例总结
Dec 26 Javascript
快速掌握jQuery插件开发
Jan 19 Javascript
js实现登录框鼠标拖拽效果
Mar 09 Javascript
xmlplus组件设计系列之按钮(2)
Apr 26 Javascript
jquery实现图片轮播器
May 23 jQuery
深入探究angular2 UI组件之primeNG用法
Jul 26 Javascript
浅谈在vue项目中如何定义全局变量和全局函数
Oct 24 Javascript
浅谈Vue SSR 的 Cookies 问题
Nov 20 Javascript
解决layui-open关闭自身窗口的问题
Sep 10 Javascript
让 babel webpack vue 配置文件支持智能提示的方法
Jun 22 #Javascript
简单了解TypeScript中如何继承 Error 类
Jun 21 #Javascript
如何在JavaScript中谨慎使用代码注释
Jun 21 #Javascript
简单了解JavaScript中常见的反模式
Jun 21 #Javascript
通过图带你深入了解vue的响应式原理
Jun 21 #Javascript
10种JavaScript最常见的错误(小结)
Jun 21 #Javascript
微信小程序开发注意指南和优化实践(小结)
Jun 21 #Javascript
You might like
DOTA2【瓜皮时刻】Vol.91 RTZ山史最惨“矿难”
2021/03/05 DOTA
windows下zendframework项目环境搭建(通过命令行配置)
2012/12/06 PHP
基于php在各种web服务器的运行模式详解
2013/06/03 PHP
PHP随机生成随机个数的字母组合示例
2014/01/14 PHP
PHP产生不重复随机数的5个方法总结
2014/11/12 PHP
详解php比较操作符的安全问题
2015/12/03 PHP
详解PHP中的序列化、反序列化操作
2017/03/21 PHP
PHP工厂模式的日常使用
2019/03/20 PHP
cument.execCommand()用法深入理解
2012/12/04 Javascript
js实现鼠标经过时图片滚动停止的方法
2015/02/16 Javascript
javascript实现点击按钮让DIV层弹性移动的方法
2015/02/24 Javascript
JavaScript检查弹出窗口是否被阻拦的方法技巧
2015/03/13 Javascript
学习JavaScript设计模式(接口)
2015/11/26 Javascript
AngularJS入门教程之过滤器详解
2016/08/19 Javascript
Vue Cli与BootStrap结合实现表格分页功能
2017/08/18 Javascript
js实现购物车功能
2018/06/12 Javascript
vue拖拽排序插件vuedraggable使用方法详解
2020/08/21 Javascript
Vue CLI2升级至Vue CLI3的方法步骤
2019/05/20 Javascript
vue抽出组件并传值实例
2020/07/31 Javascript
[46:47]2014 DOTA2国际邀请赛中国区预选赛 DT VS HGT
2014/05/22 DOTA
python使用clear方法清除字典内全部数据实例
2015/07/11 Python
Fiddler如何抓取手机APP数据包
2016/01/22 Python
Python内建函数之raw_input()与input()代码解析
2017/10/26 Python
python dataframe NaN处理方式
2019/12/26 Python
用python对excel进行操作(读,写,修改)
2020/12/25 Python
家长给孩子的表扬信
2014/01/17 职场文书
孝敬父母的活动方案
2014/08/31 职场文书
企业总经理助理岗位职责
2014/09/12 职场文书
领导党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
2014年纠风工作总结
2014/12/08 职场文书
给上级领导的感谢信
2015/01/22 职场文书
新员工入职感想
2015/08/07 职场文书
创业计划书之面包店
2019/09/12 职场文书
Django操作cookie的实现
2021/05/26 Python
Python实现查询剪贴板自动匹配信息的思路详解
2021/07/09 Python
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
2022/12/24 MySQL