首页 > Web开发 > 详细

js原型继承中的两种方法对比

时间:2014-03-30 15:45:35      阅读:520      评论:0      收藏:0      [点我收藏+]

在实际的项目中,我们通常都是用构造函数来创建一个对象,再将一些常用的方法添加到其原型对象上。最后要么直接实例化该对象,要么将它作为父类,再申明一个对象,继承该父类。

而在继承的时候有两种常用方式,今天我们就来稍作探讨

bubuko.com,布布扣
1 //父类
2  function Person(name){
3     this.name = name;
4 };
5 
6  // 子类
7  function Student(sex){
8   Person.apply(this,arguments); //继承父类的构造函数
9   this.sex=sex;
10  };
bubuko.com,布布扣

1,继承Prototype:

bubuko.com,布布扣
1  Student.prototype = Person.prototype; //执行完此句时,Student.prototype.constructor 指向的是Person,为什么了?因为Person.prototype.constructor指向Person,对象的赋值实质上是引用赋值,所以Student.prototype.constructor也指向Person
2  Student.prototype.constructor = Student;  //  将Student.prototype.constructor 指回Person
bubuko.com,布布扣

用Person的原型对象来覆盖Student的原型对象;前面说到对象的赋值实质上是引用赋值,所以如果Student.prototype上的任何修改都会体现到Person.prototype中,即子类会影响父类。

看下面:

bubuko.com,布布扣
1 Student.prototype.add=function(){alert("add")};
2 Person.prototype.add();//弹出add
bubuko.com,布布扣

2,继承实例:

bubuko.com,布布扣
1 Student.prototype = new Person();  //如果此处不传递参数,可以不写();即直接写成 new Person;
2 Student.prototype.constructor = Student;
bubuko.com,布布扣

用Person的实例来覆盖Student的原型对象;创建了实例,比起前面那种,显示是浪费内存了,不过这同时也解决了上面那种方法的缺点,即此时Student.prototype上的任何修改不会体现到Person.prototype中,即子类不会影响父类。

3,利用控对象来组合1和2的优点,去掉缺点

bubuko.com,布布扣
1 var  F = function(){};
2 F.prototype = Person.prototype;
3 Student.prototype  = new F();
4 Student.prototype.constructor  = Student;
bubuko.com,布布扣

F是个空对象,上面只有些原型方法,实例化时内存占用较少,同时也隔离开了子类对父类的影响。

开心一刻:

bubuko.com,布布扣

js原型继承中的两种方法对比,布布扣,bubuko.com

js原型继承中的两种方法对比

原文:http://www.cnblogs.com/wenber/p/3632467.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!