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 相关文章推荐
Javascript模板技术
Apr 27 Javascript
jquery imgareaselect 使用利用js与程序结合实现图片剪切
Jul 30 Javascript
JavaScript中的noscript元素属性位置及作用介绍
Apr 11 Javascript
JavaScript通过select动态更换图片的方法
Mar 23 Javascript
js阻止浏览器默认行为的简单实例
May 15 Javascript
微信小程序 简单DEMO布局,逻辑,样式的练习
Nov 30 Javascript
微信小程序之页面拦截器的示例代码
Sep 07 Javascript
jQuery+PHP实现上传裁剪图片
Jun 29 jQuery
微信小程序实现获取小程序码和二维码java接口开发
Mar 29 Javascript
Vue的data、computed、watch源码浅谈
Apr 04 Javascript
vue+Element中table表格实现可编辑(select下拉框)
May 21 Javascript
vue实现图片按比例缩放问题操作
Aug 11 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新手上路(二)
2006/10/09 PHP
PHP中删除变量时unset()和null的区别分析
2011/01/27 PHP
阿里对象存储OSS在laravel框架中的使用方法
2019/10/13 PHP
XmlUtils JS操作XML工具类
2009/10/01 Javascript
javascript循环变量注册dom事件 之强大的闭包
2010/09/08 Javascript
jquery中focus()函数实现当对象获得焦点后自动把光标移到内容最后
2013/09/29 Javascript
删除javascript中注释语句的正则表达式
2014/06/11 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(一)
2015/12/10 Javascript
基于BootStrap实现局部刷新分页实例代码
2016/08/08 Javascript
利用forever和pm2部署node.js项目过程
2017/05/10 Javascript
nodejs开发微信小程序实现密码加密
2017/07/11 NodeJs
关于vue.extend和vue.component的区别浅析
2017/08/16 Javascript
javaScript和jQuery自动加载简单代码实现方法
2017/11/24 jQuery
详解微信小程序调起键盘性能优化
2018/07/24 Javascript
jQuery滑动效果实现方法分析
2018/09/05 jQuery
微信小程序实现随机验证码功能
2018/12/20 Javascript
JavaScript 实现HTML DOM增删改查操作的常见方法详解
2020/01/04 Javascript
JS加载解析Markdown文档过程详解
2020/05/19 Javascript
[00:02]DOTA2新版本使用PA至宝后暴击展示
2014/11/19 DOTA
基于python脚本实现软件的注册功能(机器码+注册码机制)
2016/10/09 Python
python使用logging模块发送邮件代码示例
2018/01/18 Python
python 检查文件mime类型的方法
2018/12/08 Python
PyQt5下拉式复选框QComboCheckBox的实例
2019/06/25 Python
python 使用matplotlib 实现从文件中读取x,y坐标的可视化方法
2019/07/04 Python
详解python列表(list)的使用技巧及高级操作
2019/08/15 Python
matplotlib 对坐标的控制,加图例注释的操作
2020/04/17 Python
python自动生成sql语句的脚本
2021/02/24 Python
使用 css3 transform 属性来变换背景图的方法
2019/05/07 HTML / CSS
html5实现微信打飞机游戏
2014/03/27 HTML / CSS
墨西哥运动服饰和鞋网上商店:Netshoes墨西哥
2016/07/28 全球购物
印度民族服装购物网站:BIBA
2019/08/05 全球购物
趣味体育活动方案
2014/02/08 职场文书
社区活动总结报告
2014/05/05 职场文书
2015年建党94周年演讲稿
2015/03/19 职场文书
P站美图推荐——变身女主角特辑
2022/03/20 日漫
Android 中的类文件和类加载器详情
2022/06/05 Java/Android