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 相关文章推荐
jQuery 开发者应该注意的9个错误
May 03 Javascript
简单实用的全选反选按钮例子
Oct 18 Javascript
jQuery实现可收缩展开的级联菜单实例代码
Nov 27 Javascript
jQuery中slideUp 和 slideDown 的点击事件
Feb 26 Javascript
延时加载JavaScript代码提高速度
Dec 27 Javascript
JavaScript判断数字是否为质数的方法汇总
Jun 02 Javascript
JS实现鼠标框选效果完整实例
Jun 20 Javascript
JavaScript正则表达式替换字符串中图片地址(img src)的方法
Jan 13 Javascript
微信小程序 页面跳转和数据传递实例详解
Jan 19 Javascript
手把手教你使用TypeScript开发Node.js应用
May 06 Javascript
js实现旋转木马轮播图效果
Jan 10 Javascript
keep-alive保持组件状态的方法
Dec 02 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
php 生成WML页面方法详解
2009/08/09 PHP
php设计模式之装饰模式应用案例详解
2019/06/17 PHP
php swoole多进程/多线程用法示例【基于php7nts版】
2019/08/12 PHP
跟着JQuery API学Jquery 之三 筛选
2010/04/09 Javascript
js 控制下拉菜单刷新的方法
2013/03/03 Javascript
JQuery的Ajax请求实现局部刷新的简单实例
2014/02/11 Javascript
jquery实现的一个简单进度条效果实例
2014/05/12 Javascript
JavaScript中的Truthy和Falsy介绍
2015/01/01 Javascript
jQuery源码分析之sizzle选择器详解
2017/02/13 Javascript
jQuery插件MovingBoxes实现左右滑动中间放大图片效果
2017/02/28 Javascript
vue引入ueditor及node后台配置详解
2018/01/03 Javascript
使用Vue.js和Flask来构建一个单页的App的示例
2018/03/21 Javascript
Vue实现6位数密码效果
2018/08/18 Javascript
让webpack+vue-cil项目不再自动打开浏览器的方法
2018/09/27 Javascript
jquery实现烟花效果(面向对象)
2020/03/10 jQuery
js实现3D旋转相册
2020/08/02 Javascript
[01:01:24]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第三局
2016/02/25 DOTA
python下如何让web元素的生成更简单的分析
2008/07/17 Python
简单了解Django模板的使用
2017/12/20 Python
Django 项目重命名的实现步骤解析
2019/08/14 Python
python中用logging实现日志滚动和过期日志删除功能
2019/08/20 Python
详解Python 字符串相似性的几种度量方法
2019/08/29 Python
如何用Matplotlib 画三维图的示例代码
2020/07/28 Python
Pythonic版二分查找实现过程原理解析
2020/08/11 Python
使用Python判断一个文件是否被占用的方法教程
2020/12/16 Python
猫途鹰:全球领先的旅游点评社区
2017/04/07 全球购物
JOSEPH官网:英国奢侈时尚品牌
2018/01/31 全球购物
教师实习期自我鉴定
2013/10/06 职场文书
英语专业毕业生自我鉴定
2013/11/09 职场文书
我未来的职业规划范文
2014/01/11 职场文书
售后服务承诺书
2014/03/26 职场文书
传承焦裕禄精神思想汇报2014
2014/09/10 职场文书
工作试用期自我评价
2015/03/10 职场文书
农村党支部承诺书
2015/04/30 职场文书
信息技术远程培训心得体会
2016/01/09 职场文书
2016年九九重阳节活动总结
2016/04/01 职场文书