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 相关文章推荐
Javascript的时间戳和php的时间戳转换注意事项
Apr 12 Javascript
js中switch case循环实例代码
Dec 30 Javascript
使用JS画图之点、线、面
Jan 12 Javascript
jQuery实现布局高宽自适应的简单实例
May 28 Javascript
JS及PHP代码编写八大排序算法
Jul 12 Javascript
Angular 4.X开发实践中的踩坑小结
Jul 04 Javascript
vue-router懒加载速度缓慢问题及解决方法
Nov 25 Javascript
小程序hover-class点击态效果实现
Feb 26 Javascript
vue data恢复初始化数据的实现方法
Oct 31 Javascript
在Vue中实现随hash改变响应菜单高亮
Mar 09 Javascript
浅析JavaScript 函数柯里化
Sep 08 Javascript
四十九个javascript小知识实用技巧
Nov 20 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
一个可以找出源代码中所有中文的工具
2006/10/25 PHP
escape unescape的php下的实现方法
2007/04/27 PHP
PHP、Python和Javascript的装饰器模式对比
2015/02/03 PHP
php中注册器模式类用法实例分析
2015/11/03 PHP
CodeIgniter钩子用法实例详解
2016/01/20 PHP
php获取一定范围内取N个不重复的随机数
2016/05/28 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
2019/06/03 PHP
用JavaScript实现仿Windows关机效果
2007/03/10 Javascript
DIY jquery plugin - tabs标签切换实现代码
2010/12/11 Javascript
jquery.post用法示例代码
2014/01/03 Javascript
jquery退出each循环的写法
2014/02/26 Javascript
JS日期加减,日期运算代码
2015/11/05 Javascript
浅谈DOM的操作以及性能优化问题-重绘重排
2017/01/08 Javascript
HTML的select控件美化
2017/03/27 Javascript
JavaScript中如何判断一个值的类型
2017/09/15 Javascript
Vue路由钩子之afterEach beforeEach的区别详解
2018/07/15 Javascript
Vue路由history模式解决404问题的几种方法
2018/09/29 Javascript
js实现限定范围拖拽的示例
2020/10/26 Javascript
[34:56]Ti4冒泡赛LGD vs Liquid 1
2014/07/14 DOTA
[55:04]海涛DOTA2死魂复燃6.82版本介绍
2014/09/28 DOTA
[03:10]超级美酒第四天 fy拉比克秀 大合集
2018/06/05 DOTA
Python实现竖排打印传单手机号码易撕条
2015/03/16 Python
如何利用Fabric自动化你的任务
2016/10/20 Python
Win7 64位下python3.6.5安装配置图文教程
2020/10/27 Python
python3.7.0的安装步骤
2018/08/27 Python
pycharm new project变成灰色的解决方法
2019/06/27 Python
利用python实现逐步回归
2020/02/24 Python
Python爬虫实战案例之爬取喜马拉雅音频数据详解
2020/12/07 Python
python中time、datetime模块的使用
2020/12/14 Python
Python3爬虫RedisDump的安装步骤
2021/02/20 Python
加拿大女装网上购物:Reitmans
2016/10/20 全球购物
伦敦新晋轻奢耳饰潮牌:Tada & Toy
2020/05/25 全球购物
个人简历中自我评价
2014/02/11 职场文书
信息管理与信息系统专业求职信
2014/06/21 职场文书
入股合作协议书
2014/10/12 职场文书
成本会计实训报告
2014/11/05 职场文书