JS伪继承prototype实现方法示例


Posted in Javascript onJune 20, 2018

本文实例讲述了JS伪继承prototype实现方法。分享给大家供大家参考,具体如下:

众所周知JS中没有类的概念,但是要想实现类的功能可以同过function模拟。如:

第一种继承 (属性继承)

//该函数相当于是一个构造器,也是一个伪类
  function Fn(){
    this.a = 4;
    this.b = 5;
    this.log = function(){
      console.log(this.a,this.b);
    }
  }
  function Fn1(){
    Fn.call(this);//调用父类的构造函数
  }
  Fn1.prototype = Fn.prototype;
  var fn = new Fn();
  var fn1 = new Fn1();
  //由此可见Fn1 是fn1的子类。
  fn1 instanceof Fn; // true
  fn instanceof Fn1; // true
  fn.a = 5;
  //由此可见Fn1 继承了 Fn得所有属性和方法
  //而是是复制了一份Fn的属性和方法,并不是对象的引用。
  console.log(fn.a); // 5
  console.log(fn1.a); // 4
  this.log(); // 4 5

总结: 这种继承,是重新拷贝一份放入内存中,他们的值互相独立,修改一个不会改变另一个。

第二种继承 原型继承(prototype)

function Fn(){}
  Fn.prototype.data = {
    name: 'zhangsan'
  }
  Fn.prototype.getName = function(){
    return this.data.name;
  }
  function Fn1(){}
  //原型链继承
  Fn1.prototype = Fn.prototype;
  var fn = new Fn();
  var fn1 = new Fn1();
  //所用Fn1 继承了 Fn
  fn1 instanceof Fn;//true
  console.log(fn1.getName()); // zhangsan
  console.log(fn.getName()); // zhangsan
  //修改了fn的name属性值
  fn.data.name = 'lisi';
  // 由此我们可看出 原型链继承 是 引用继承
  //不会重新拷贝一份变量。就像对象的引用一样。
  console.log(fn.getName()); // lisi
  console.log(fn1.getName()); // lisi

两种类的写法造成示例的区别

//第一种
  function Fn(){
    this.a = 4;
    this.b = 5;
    this.log = function(){
      console.log(this.a,this.b);
    }
  }
  var fn1 = new Fn();
  var fn2 = new Fn();
  fn1.a = 1;
  //由此可以看出两个对象互不影响
  //说明每个对象里都存在一份a和b
  fn1.log(); // 1 5
  fn2.log(); // 4 5
  //第二种
  function Fn(){}
  fn.prototype.name = 'zhangsan';
  fn.prototype.data = {
    a: 4,
    b: 5
  }
  fn.prototype.log = function(){
    console.log(this.data.a,this.data.b);
  }
  var fn1 = new Fn();
  var fn2 = new Fn();
  fn1.a = 1;
  //由此可见就算是不同的示例他们他们所指向的值是同一个。
  fn1.log();//1 5
  fn2.log();//1 5
  fn2.name = 'lisi';
  //这里fn1.name并没有被修改
  console.log(fn1.name); //zhangan
  console.log(fn2.name); // lisi

总结

类中直接this. 出来的属性和方法都会直接复制一份给子类或者实例对象。个子类或实例对象之间互不影响。

使用prototype增加的属性和方法,对象类型的只有一份,值类型的这会被复制。

收获

由于函数都是通用的,所以比较上面两种方法,第二种明显比第一种性能要好的多,因为避免了没有必要的复制,肯定会比较节省内存。所以以后写类的时候,尽量使用第二种方式。

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

Javascript 相关文章推荐
JS判断客户端是手机还是PC的2个代码
Apr 12 Javascript
Node.js抓取中文网页乱码问题和解决方法
Feb 10 Javascript
javascript中select下拉框的用法总结
Jan 07 Javascript
js获取页面引用的css样式表中的属性值方法(推荐)
Aug 19 Javascript
bootstrap table实现单击单元格可编辑功能
Mar 28 Javascript
详解Vue2.X的路由管理记录之 钩子函数(切割流水线)
May 02 Javascript
常见的浏览器Hack技巧整理
Jun 29 Javascript
jQuery实现html双向绑定功能示例
Oct 09 jQuery
js 两个日期比较相差多少天的实例
Oct 19 Javascript
node中的session的具体使用
Sep 14 Javascript
DatePickerDialog 自定义样式及使用全解
Jul 09 Javascript
layui table 列宽百分比显示的实现方法
Sep 28 Javascript
通过jquery.cookie.js实现记住用户名、密码登录功能
Jun 20 #jQuery
Vue.JS实现垂直方向展开、收缩不定高度模块的JS组件
Jun 19 #Javascript
Vue兼容ie9的问题全面解决方案
Jun 19 #Javascript
详解Vue-cli中的静态资源管理(src/assets和static/的区别)
Jun 19 #Javascript
vue-cli2.x项目优化之引入本地静态库文件的方法
Jun 19 #Javascript
vue异步加载高德地图的实现
Jun 19 #Javascript
angular 实现的输入框数字千分位及保留几位小数点功能示例
Jun 19 #Javascript
You might like
咖啡豆要不要放冰箱的原因
2021/03/04 冲泡冲煮
PHP生成网页快照 不用COM不用扩展.
2010/02/11 PHP
php如何执行非缓冲查询API
2016/07/22 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
laravel 自定义常量的两种方案
2019/10/14 PHP
goto语法在PHP中的使用教程
2020/09/17 PHP
js的event详解。
2006/09/06 Javascript
将string解析为json的几种方式小结
2010/11/11 Javascript
javascript文件加载管理简单实现方法
2015/07/25 Javascript
js HTML5多图片上传及预览实例解析(不含前端的文件分割)
2016/08/26 Javascript
微信小程序 购物车简单实例
2016/10/24 Javascript
Vue.js实现一个todo-list的上移下移删除功能
2017/06/26 Javascript
基于jQuery实现的Ajax 验证用户名唯一性实例代码
2017/06/28 jQuery
详解Angular-cli生成组件修改css成less或sass的实例
2017/07/27 Javascript
js中怎么判断两个字符串相等的实例
2019/01/17 Javascript
在Vue mounted方法中使用data变量详解
2019/11/05 Javascript
分享python数据统计的一些小技巧
2016/07/21 Python
详解Python if-elif-else知识点
2018/06/11 Python
用Python分析3天破10亿的《我不是药神》到底神在哪?
2018/07/12 Python
Django Admin设置应用程序及模型顺序方法详解
2020/04/01 Python
在Keras中实现保存和加载权重及模型结构
2020/06/15 Python
django教程如何自学
2020/07/31 Python
如何基于Python爬虫爬取美团酒店信息
2020/11/03 Python
CSS3混合模式mix-blend-mode/background-blend-mode简介
2018/03/15 HTML / CSS
会议邀请书范文
2014/02/02 职场文书
安全生产承诺书范文
2014/05/22 职场文书
公司口号大全
2014/06/11 职场文书
大学生军训自我鉴定范文
2014/09/18 职场文书
起诉书格式范文
2015/05/20 职场文书
小学运动会加油词
2015/07/18 职场文书
民警忠诚教育心得体会
2016/01/23 职场文书
SpringBoot+Redis实现布隆过滤器的示例代码
2022/03/17 Java/Android
基于Python实现对比Exce的工具
2022/04/07 Python
MySql重置root密码 --skip-grant-tables
2022/04/11 MySQL
微信小程序APP页面的之间的相互传递参数以及自定义组件
2022/04/19 Javascript
在 Python 中利用 Pool 进行多线程
2022/04/24 Python