最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

JS伪继承prototype实现方法示例

来源:动视网 责编:小采 时间:2020-11-27 22:12:39
文档

JS伪继承prototype实现方法示例

JS伪继承prototype实现方法示例:本文实例讲述了JS伪继承prototype实现方法。分享给大家供大家参考,具体如下: 众所周知JS中没有类的概念,但是要想实现类的功能可以同过function模拟。如: 第一种继承 (属性继承) //该函数相当于是一个构造器,也是一个伪类 function Fn()
推荐度:
导读JS伪继承prototype实现方法示例:本文实例讲述了JS伪继承prototype实现方法。分享给大家供大家参考,具体如下: 众所周知JS中没有类的概念,但是要想实现类的功能可以同过function模拟。如: 第一种继承 (属性继承) //该函数相当于是一个构造器,也是一个伪类 function Fn()


本文实例讲述了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程序设计有所帮助。

文档

JS伪继承prototype实现方法示例

JS伪继承prototype实现方法示例:本文实例讲述了JS伪继承prototype实现方法。分享给大家供大家参考,具体如下: 众所周知JS中没有类的概念,但是要想实现类的功能可以同过function模拟。如: 第一种继承 (属性继承) //该函数相当于是一个构造器,也是一个伪类 function Fn()
推荐度:
标签: js 示例 实例
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top