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 09 Javascript
js实现在字符串中提取数字
Nov 05 Javascript
PHPMyAdmin导入时提示文件大小超出PHP限制的解决方法
Mar 30 Javascript
解析javascript中鼠标滚轮事件
May 26 Javascript
Grunt入门教程(自动任务运行器)
Aug 06 Javascript
jQuery中设置form表单中action值的实现方法
May 25 Javascript
jQuery多级联动下拉插件chained用法示例
Aug 20 Javascript
seajs学习之模块的依赖加载及模块API的导出
Oct 20 Javascript
JavaScript Date 知识浅析
Jan 29 Javascript
聊聊那些使用前端Javascript实现的机器学习类库
Sep 18 Javascript
Vue波纹按钮组件制作
Apr 30 Javascript
JavaScript数组基于交换的排序示例【冒泡排序】
Jul 21 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
深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)
2013/02/06 PHP
php对数组内元素进行随机调换的方法
2015/05/12 PHP
不使用中间变量,交换int型的 a, b两个变量的值。
2010/10/29 Javascript
两种方法实现在HTML页面加载完毕后运行某个js
2014/06/16 Javascript
javascript:void(0)点击登录没反应怎么解决
2015/11/13 Javascript
JS清除字符串中重复值的实现方法
2016/08/03 Javascript
javascript的函数劫持浅析
2016/09/26 Javascript
BootStrap网页中代码显示用法详解
2016/10/21 Javascript
详解javascript表单的Ajax提交插件的使用
2016/12/29 Javascript
详解Angular之constructor和ngOnInit差异及适用场景
2017/06/22 Javascript
分析JS单线程异步io回调的特性
2017/12/01 Javascript
vue组件中实现嵌套子组件案例
2020/08/31 Javascript
python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
2017/03/12 Python
python在非root权限下的安装方法
2018/01/23 Python
python 3.7.0 安装配置方法图文教程
2018/08/27 Python
pycharm修改界面主题颜色的方法
2019/01/17 Python
Django之无名分组和有名分组的实现
2019/04/16 Python
用Python配平化学方程式的方法
2019/07/20 Python
基于python 等频分箱qcut问题的解决
2020/03/03 Python
Keras 快速解决OOM超内存的问题
2020/06/11 Python
Python利用matplotlib绘制散点图的新手教程
2020/11/05 Python
Microsoft新加坡官方网站:购买微软最新软件和技术产品
2016/10/28 全球购物
英国评分最高的女性剃须刀订阅盒:FFS Beauty
2018/01/25 全球购物
Merchant 1948澳大利亚:新西兰领先的鞋类和靴子供应商
2018/03/24 全球购物
Scotch Porter官方网站:男士美容产品
2020/08/31 全球购物
职业女性的职业规划
2014/03/04 职场文书
二手房购房意向书范本
2014/04/01 职场文书
十一国庆节“向国旗敬礼”主题班会活动方案
2014/09/27 职场文书
出国签证在职证明范本
2014/11/24 职场文书
成品仓管员岗位职责
2015/04/01 职场文书
学习党章心得体会2016
2016/01/15 职场文书
初中思想品德教学反思
2016/02/24 职场文书
Go使用协程交替打印字符
2021/04/29 Golang
Python办公自动化解决world文件批量转换
2021/09/15 Python
Python经常使用的一些内置函数
2022/04/11 Python
解决MySQL报“too many connections“错误
2022/04/19 MySQL