足球经理97中文版:JS伪继承prototype实现方法示例

足球竞彩网 www.2ts2.com.cn  更新时间:2018年06月20日 08:38:44   作者:輘酆   我要评论

这篇文章主要介绍了JS伪继承prototype实现方法,结合实例形式对比分析了基于prototype实现模拟继承的相关操作技巧,需要的朋友可以参考下

本文实例讲述了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错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结

希望本文所述对大家JavaScript程序设计有所帮助。

相关文章

最新评论

  • 浙江大学杭州国际城市学研究中心博士后研究基地2018年上半年招聘启事 2019-04-20
  • 引爆全联盟!勇士老板宣布球队计划 完全不给活路 2019-04-16
  • 特金会:无非就是“一大”和“一多”!—吴建勋的博客—强国博客—人民网 2019-04-13
  • 贵州瓮安:荒坡变花海 美景引客来 2019-04-12
  • 国家审计促发展 促改革 促安全 促绩效系列访谈 2019-04-12
  • 中国是亚洲和平的基石 2019-04-05
  • 足球运动也是需要不断创新的,不能老是跟着别人的套路走!同样需要较高的综合素质,不能从小就走上专业化的道路。不然就只能是四肢发达头脑简单,就会陷入机械足球的泥潭! 2019-04-05
  • 你这帖子怎么像四两为你代笔的?[微笑] 2019-04-02
  • 郑板桥的“六分半书” 2019-04-02
  • 重庆私藏的绝美古镇 悠闲不打挤 2019-04-01
  • 香江直通车之专访香港义工联盟常务副主席马浩文 2019-03-31
  • 云南大学:努力开创边疆民族地区建设一流大学之路 2019-03-26
  • 女性之声——全国妇联 2019-03-19
  • 全国省级新税务机构统一挂牌 2019-03-05
  • 一根充电线从天而降 楼下玛莎拉蒂被砸出两个凹陷 2019-03-01
  • 343| 609| 801| 536| 413| 270| 32| 234| 160| 457|