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传值 判断
Oct 26 Javascript
javascript 动态调整图片尺寸实现代码
Dec 28 Javascript
js 刷新页面的代码小结 推荐
Apr 02 Javascript
jquery 使用点滴函数代码
May 20 Javascript
禁止IE用右键的JS代码
Dec 30 Javascript
javascript使用switch case实现动态改变超级链接文字及地址
Dec 16 Javascript
JavaScript中的条件判断语句使用详解
Jun 03 Javascript
Angular2  NgModule 模块详解
Oct 19 Javascript
PHP实现本地图片上传和验证功能
Feb 27 Javascript
AngularJS中下拉框的高级用法示例
Oct 11 Javascript
基于javascript的拖拽类封装详解
Apr 19 Javascript
使用konva和vue-konva库实现拖拽滑块验证功能
Apr 27 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 substr,mb_substr以及mb_strcut的区别和用法
2013/06/21 PHP
php实现转换ubb代码的方法
2015/06/18 PHP
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
2016/04/20 PHP
PHP实现按之字形顺序打印二叉树的方法
2018/01/16 PHP
php数组函数array_push()、array_pop()及array_shift()简单用法示例
2020/01/26 PHP
让焦点自动跳转
2006/07/01 Javascript
jquery animate 动画效果使用说明
2009/11/04 Javascript
JQuery自定义事件的应用 JQuery最佳实践
2010/08/01 Javascript
jqTransform form表单美化插件使用方法
2012/07/05 Javascript
js实现拉伸拖动iframe的具体代码
2013/08/03 Javascript
jquery列表拖动排列(由项目提取相当好用)
2014/06/17 Javascript
jquery实现的下拉和收缩效果示例
2014/08/21 Javascript
Jquery判断form表单数据是否变化
2016/03/30 Javascript
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
2016/07/26 NodeJs
bootstrapValidator 重新启用提交按钮的方法
2017/02/20 Javascript
React Native验证码倒计时工具类分享
2017/10/24 Javascript
Vue完整项目构建(进阶篇)
2018/02/10 Javascript
Vue列表如何实现滚动到指定位置样式改变效果
2020/05/09 Javascript
Vue数组响应式操作及高阶函数使用代码详解
2020/08/01 Javascript
Python的Twisted框架上手前所必须了解的异步编程思想
2016/05/25 Python
Python实现向服务器请求压缩数据及解压缩数据的方法示例
2017/06/09 Python
python批量修改文件编码格式的方法
2018/05/31 Python
python批量下载抖音视频
2019/06/17 Python
Python如何基于rsa模块实现非对称加密与解密
2020/01/03 Python
Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)
2020/04/08 Python
Python如何获取文件指定行的内容
2020/05/27 Python
浅谈TensorFlow中读取图像数据的三种方式
2020/06/30 Python
pytorch 实现L2和L1正则化regularization的操作
2021/03/03 Python
css3.0 图形构成实例练习一
2013/03/19 HTML / CSS
土木工程毕业生自荐信
2013/11/12 职场文书
初一体育教学反思
2014/01/29 职场文书
四风问题自查报告剖析材料
2014/02/08 职场文书
让子弹飞观后感
2015/06/11 职场文书
工作汇报材料难写?方法都在这里了!
2019/07/01 职场文书
python munch库的使用解析
2021/05/25 Python
如何优化vue打包文件过大
2022/04/13 Vue.js