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 插件学习(五)
Aug 06 Javascript
js获取对象、数组的实际长度,元素实际个数的实现代码
Jun 08 Javascript
详解用node编写自己的cli工具
May 23 Javascript
利用webstrom调试Vue.js单页面程序的方法教程
Jun 06 Javascript
详解Layer弹出层样式
Aug 21 Javascript
bootstrap fileinput实现文件上传功能
Aug 23 Javascript
jQuery实现倒计时功能 jQuery实现计时器功能
Sep 19 jQuery
Koa2 之文件上传下载的示例代码
Mar 29 Javascript
Layui数据表格之获取表格中所有的数据方法
Aug 20 Javascript
详解在HTTPS 项目中使用百度地图 API
Apr 26 Javascript
使用Vue开发自己的Chrome扩展程序过程详解
Jun 21 Javascript
卸载vue2.0并升级vue_cli3.0的实例讲解
Feb 16 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学习笔记 数组遍历实现代码
2011/06/09 PHP
PHP 处理TXT文件(打开/关闭/检查/读取)
2013/05/13 PHP
C#使用PHP服务端的Web Service通信实例
2014/04/08 PHP
PHP解决中文乱码
2017/04/28 PHP
PHP实现限制IP访问及提交次数的方法详解
2017/07/17 PHP
PHP7内核之Reference详解
2019/03/14 PHP
PHP dirname(__FILE__)原理及用法解析
2020/10/28 PHP
禁止F5等快捷键的JS代码
2007/03/06 Javascript
IE JS编程需注意的内存释放问题
2009/06/23 Javascript
javascript 面向对象全新理练之继承与多态
2009/12/03 Javascript
jquery入门—编写一个导航条(可伸缩)
2013/01/07 Javascript
jQuery中(function(){})()执行顺序的理解
2013/03/05 Javascript
解析javascript 实用函数的使用详解
2013/05/10 Javascript
angular.js分页代码的实例
2016/07/27 Javascript
JS实现图片局部放大或缩小的方法
2016/08/20 Javascript
基于bootstrap-datetimepicker.js不支持IE8的快速解决方法
2016/11/07 Javascript
纯javascript版日历控件
2016/11/24 Javascript
Javascript之面向对象--封装
2016/12/02 Javascript
JS中如何实现复选框全选功能
2016/12/19 Javascript
JS中使用gulp实现压缩文件及浏览器热加载功能
2017/07/12 Javascript
react-router v4如何使用history控制路由跳转详解
2018/01/09 Javascript
Fundebug支持监控微信小程序HTTP请求错误的方法
2019/02/21 Javascript
layer.confirm点击第一个按钮关闭弹出框的方法
2019/09/09 Javascript
vue+element搭建后台小总结 el-dropdown下拉功能
2020/04/10 Javascript
vue-calendar-component 封装多日期选择组件的实例代码
2020/12/04 Vue.js
Vue 实现可视化拖拽页面编辑器
2021/02/01 Vue.js
python3中zip()函数使用详解
2018/06/29 Python
运用PyTorch动手搭建一个共享单车预测器
2019/08/06 Python
Python实现异步IO的示例
2020/11/05 Python
python基于selenium爬取斗鱼弹幕
2021/02/20 Python
HTML5标签与HTML4标签的区别示例介绍
2013/07/18 HTML / CSS
2014法制宣传日活动总结范文
2014/11/01 职场文书
家长会主持词开场白
2015/05/29 职场文书
毕业生政审意见范文
2015/06/04 职场文书
部分武汉产收音机展览
2022/04/07 无线电
一次SQL查询优化原理分析(900W+数据从17s到300ms)
2022/06/10 SQL Server