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 multiple全选与取消全选实现代码
Dec 04 Javascript
javascript中html字符串转化为jquery dom对象的方法
Aug 27 Javascript
跟我学习javascript的函数调用和构造函数调用
Nov 16 Javascript
javascript下拉列表中显示树形菜单的实现方法
Nov 17 Javascript
利用jQuery设计一个简单的web音乐播放器的实例分享
Mar 08 Javascript
jQuery基于排序功能实现上移、下移的方法
Nov 26 Javascript
微信小程序实现图片预览功能
Jan 31 Javascript
JS实现简单的星期格式转换功能示例
Jul 23 Javascript
浅谈Vue的响应式原理
May 30 Javascript
node.js的http.createServer过程深入解析
Jun 06 Javascript
jQuery轮播图功能制作方法详解
Dec 03 jQuery
简单了解JavaScript arguement原理及作用
May 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
一个简洁的多级别论坛
2006/10/09 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
Yii框架 session 数据库存储操作方法示例
2019/11/18 PHP
Js 中debug方式
2010/02/07 Javascript
js 内存释放问题
2010/04/25 Javascript
一个javascript图片阅览组件
2010/11/09 Javascript
jquery中dom操作和事件的实例学习-表单验证
2011/11/30 Javascript
javascript页面动态显示时间变化示例代码
2013/12/18 Javascript
Jquery Easyui进度条组件Progress使用详解(8)
2020/03/26 Javascript
如何在Angular2中使用jQuery及其插件的方法
2017/02/09 Javascript
ES6 迭代器(Iterator)和 for.of循环使用方法学习(总结)
2018/02/08 Javascript
async/await优雅的错误处理方法总结
2019/01/30 Javascript
解决vue中使用proxy配置不同端口和ip接口问题
2019/08/14 Javascript
antd Select下拉菜单动态添加option里的内容操作
2020/11/02 Javascript
[02:23]1个至宝=115个英雄特效 最“绿”至宝拉比克“魔导师密钥”登场
2018/12/29 DOTA
python网络编程之读取网站根目录实例
2014/09/30 Python
利用Django框架中select_related和prefetch_related函数对数据库查询优化
2015/04/01 Python
Python中random模块生成随机数详解
2016/03/10 Python
浅谈python连续赋值可能引发的错误
2018/11/10 Python
通过python爬虫赚钱的方法
2019/01/29 Python
关于Python核心框架tornado的异步协程的2种方法详解
2019/08/28 Python
cookies应对python反爬虫知识点详解
2020/11/25 Python
AmazeUI 网格的实现示例
2020/08/13 HTML / CSS
中国最大隐形眼镜网上商城:视客眼镜网
2016/10/30 全球购物
印度在线内衣和时尚目的地:Zivame
2017/09/28 全球购物
什么是View State?
2013/01/27 面试题
LINUX下线程,GDI类的解释
2016/12/14 面试题
物理系毕业生自荐信
2013/11/01 职场文书
学生会离职感言
2014/02/11 职场文书
2014年文明创建工作总结
2014/11/25 职场文书
升职自我推荐信范文
2015/03/25 职场文书
汽车销售员岗位职责
2015/04/11 职场文书
写给女朋友的保证书
2015/05/09 职场文书
民事撤诉申请书范本
2015/05/18 职场文书
2016党员学习心得体会范文
2016/01/23 职场文书
linux下导入、导出mysql数据库命令的实现方法
2021/05/26 MySQL