一、利用空函数实现继承

参考了文章javascript继承—prototype属性介绍(2) 中叶小钗的评论,对这篇文章中的方案二利用一个空函数进行修改,可以解决创建子类对象时,父类实例化的过程中特权属性和特权方法,私有属性,私有方法的空耗资源问题。

复制代码

function Person(name,age){

this.name = name;

this.age = age;

}

Person.prototype = {

constructor:Person,

sayHi:function(){

alert(‘hi’);

}

}

function Student(name,age,grade){

Person.call(this,name,age);

this.grade = grade;

}

function Empty(){}

Empty.prototype = Person.prototype;

Student.prototype = new Empty();

Student.prototype.constructor = Student;

var p1 = new Person(‘xiaoming’,10);

var s1 = new Student(‘xiaohong’,9,3);

console.log(p1);//Person { name=”xiaoming”, age=10, sayHi=function()}

console.log(s1);//Student {name=”xiaohong”, age=9, grade=3, 更多…}

console.log(p1.constructor);//Person(name,age) 父类的实例指向仍是父类

console.log(s1.constructor);//Student(name,age,grade) //子类的实例指向仍是子类

复制代码

这种情况下修改Student的prototype就不会影响到Person的prototype对象了,并且,因为直接将Person的prototype赋给Empty的prototype,所以不会存在特权属性(实例属性)浪费资源的问题。这样利用空函数就能很好的解决共有方法的继承问题了。当然这时Student.prototype中的constructor是Person,所以最好加上Student.prototype.constructor = Student转换过来。

二、利用循环遍历拷贝的方法实现继承

同样对于文章javascript继承—prototype属性介绍(2)中的方案三,其实这是一种拷贝的方法,将父类所有的共有方法拷贝到子类中去。

复制代码

function Person(name,age){

this.name = name;

this.age = age;

}

Person.prototype = {

constructor:Person,

sayHi:function(){

alert(‘hi’);

}

}

function Student(name,age,grade){

Person.call(this,name,age);

this.grade = grade;

}

for(var i in Person.prototype){Student.prototype[i] = Person.prototype[i]}

Student.prototype.constructor = Student;

Student.prototype.study = function(){

alert(‘study’);

}

var p1 = new Person(‘xiaoming’,10);

var s1 = new Student(‘xiaohong’,9,3);

console.log(p1);//Person { name=”xiaoming”, age=10, sayHi=function()}

console.log(s1);//Student { name=”xiaohong”, age=9, grade=3, 更多…}

console.log(p1.constructor);//Person(name,age) 父类的实例指向仍是父类

console.log(s1.constructor);//Student(name,age,grade) //子类的实例指向仍是子类

复制代码

这种方法直接将父类的共有方法利用遍历的模式拷贝到子类中去。这样就避免了子类实例直接指向父类的问题,也不会出现修改子类的共有方法,对父类产生了影响。也算一种比较完美的继承。

最新文章

  1. inotify +rsync进行实时同步
  2. 【Android】Anroid5.0+新控件---酷炫标题栏的简单学习
  3. angularJs模糊查询
  4. php wampserver 80 端口无法开启的解决方法
  5. 开篇,UVA 755 && POJ 1002 487--3279 (Trie + DFS / sort)
  6. QEvent大全,有中文解释
  7. object标签参考(转载)
  8. 用MS自带的VS构建joint语句
  9. startActivity与startActivityForResult的使用小结
  10. IoC容器Autofac正篇之简单实例
  11. [转]Activemq管理和基本介绍
  12. 【剑指Offer学习】【面试题18 :树的子结构】
  13. TCP报文中的SYN,FIN,ACK,PSH,RST,URG
  14. Django Cookie 和 Sessions 应用
  15. 测试一下OpenLiveWriter
  16. abaqus2016安装过程中出现error:unable to add abaqus command directory to PATH variable
  17. Spring MVC 类型转换
  18. 7.4 Javascript:表单验证-揭开正則表達式的面纱
  19. (原)使用1080Ti显卡时安装ubuntu16.04.1及驱动的步骤
  20. 绿色计算大赛决赛 第二阶段 消息传递(斯坦纳树 状压dp+spfa)

热门文章

  1. php5.3+ 安装(mysqlnd )
  2. mogilefsdBUG mogilefsd[15624]: crash log: Modification of a read-only value attempted at /usr/local/share/perl5/Sys/Syscall.pm line 227
  3. nagios部署+短信和邮件报警
  4. python每日一类(5):itertools模块
  5. 牛客练习赛16 F 选值【二分/计数】
  6. Codeforces Round #289 (Div. 2, ACM ICPC Rules) A. Maximum in Table【递推】
  7. spark完整的数据倾斜解决方案
  8. HDU 4251 The Famous ICPC Team Again(划分树)
  9. Linq 连接运算符:Concat,Union
  10. UVA 103 Stacking Boxes n维最长上升子序列