我们知道,父类中的属性有this、static和prototype三种。我们常用的继承方式有两种:

  1. 原型继承:可以把父类的prototype属性全部继承下来
  2. 对象冒充:可以将父类的this属性继承下来,再配合for...in循环,可以将父类的static属性也继承下来

将这两种方式综合使用,并在此基础上,使用delete删除不需要的属性,以及通过重写方法来覆盖父属性,以达到完美继承的效果。

/*** Filename: PrefectExtend.js* Description: 该程序将通过原型继承、对象冒充和覆盖三套机制,来完美实现*   Js的继承。* Date: 2012/3/7*//*** 父类Animal,及其this、静态、prototype属性的构造。*/
Animal = function(tail) {this.tail = tail || "动物的尾巴";   // 父类的this属性this.kinds = "动物";Animal.instanceCounter ++;           // 父类的静态属性
}
Animal.instanceCounter = 0;
Animal.prototype = {                   // 父类的prototype属性happy: function() {console.log("摇动>" + this.tail);},eat: function() {console.log("动物吃生的");},run: function() {console.log("动物四条腿跑");},fight: function() {console.log("动物往死里打");}
}
// 这里如果不这样做,那么Animal.prototype.constructor == Object,详见参考资料[2]
Animal.prototype.constructor = Animal;/*** 1. 对象冒充: 继承this及static属性*/
// 子类Person
Person = function(name) {Person.superclass.call(this); // this属性继承delete this.tail; // 删除不需要的this属性this.name = name || "猎空de代码";for(var p in Animal) {          // static属性继承Person[p] = Animal[p];}
}
Person.superclass = Animal;
/*** 2. 原型继承*/
F = function() {} // 空壳函数,用于清除Animal的构造属性(this和静态)
F.prototype = Animal.prototype;
Person.prototype = new F();
delete Person.prototype.fight;  //删除不需要的prototype属性
Person.prototype.constructor = Person;
/*** 3. prototype方法覆盖*/
Person.prototype.eat = function() {console.log(this.name + "吃熟的");
}// 创建实例
var person = new Person();
console.log("姓名: " + person.name);
console.log(person.kinds);
console.log("实例数目" + Person.instanceCounter);
person.happy();
person.eat();
person.run();

程序运行结果:

参考资料:

[1]  Ext 江湖,大漠穷秋,北京:电子工业出版社,2012.1 (这段程序,基本是模仿该书写的)

[2] JavaScript类和继承:constructor属性

JavaScript 完美继承相关推荐

  1. 学习NodeJS第五天:JavaScript的继承

    人们接触 JavaScript,都被他单纯的外表给骗了,殊不知,一下子又  Functional Programming 又 Object Oriented 又前台又跑到后台,活蹦乱跳.一旦你遇到某些 ...

  2. 深入解析JavaScript 原型继承

    JavaScript 原型继承,学习js面向对象的朋友可以看看.十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下.如有不足之处,欢迎批评指正. Object.prototype Ja ...

  3. JavaScript实现继承的方式,不正确的是:

    JavaScript实现继承的方式,不正确的是:DA.原型链继承 B.构造函数继承 C.组合继承 D.关联继承 解析 javaScript实现继承共6种方式: 原型链继承.借用构造函数继承.组合继承. ...

  4. JavaScript 实现继承的5种方式

    js是一个面向对象的语言,所以具备一些面向对象的方式----------例如继承.接下来介绍5种js的继承方式.注意:js 中的函数其实是对象,函数名是对 Function 对象的引用. 1.采用ca ...

  5. 白话解释 Javascript 原型继承(prototype inheritance)

    来源: 个人博客 白话解释 Javascript 原型继承(prototype inheritance) 什么是继承? 学过"面向对象"的同学们是否还记得,老师整天挂在嘴边的面向对 ...

  6. JavaScript面向对象--继承 (超简单易懂,小白专属)...

    JavaScript面向对象--继承 (超简单易懂,小白专属) 一.继承的概念 子类共享父类的数据和方法的行为,就叫继承. 二.E55如何实现继承?探索JavaScript继承的本质 2.1构造函数之 ...

  7. JavaScript实现继承的方式和各自的优缺点

    ECMAscript只支持实现继承,主要是依靠原型链来实现的. JavaScript实现继承的方式: 类式继承 构造函数继承 组合继承 寄生组合式继承 1.类式继承 1 //类式继承 2 //声明父类 ...

  8. JavaScript实现继承的方式

    这篇文章主要介绍JavaScript实现继承的方式: 类式继承 构造函数继承 组合继承 寄生组合式继承 extends继承 1.类式继承 简单的类式继承: // 声明父类function Animal ...

  9. JavaScript之继承(原型链)

    JavaScript之继承(原型链) 我们知道继承是oo语言中不可缺少的一部分,对于JavaScript也是如此.一般的继承有两种方式:其一,接口继承,只继承方法的签名:其二,实现继承,继承实际的方法 ...

最新文章

  1. 代码和普通的java_Java中普通代码块,构造代码块,静态代码块区别及代码示例...
  2. Why Spring Boot
  3. Flutter 完美的验证码输入框(2 种方法)
  4. Xcode8.0 删除插件路径
  5. 《西游记》原著的一点读后感
  6. php ajax取不到值,PHP没有从Ajax获取值
  7. 笨方法学python3怎么样_有个很笨的女朋友,是怎么样的体验?
  8. NDR(网络威胁检测及响应)与NTA的区别(网络流量检测)
  9. 计算机技术要求单科成绩吗,软考考试合格标准怎样确定?单科成绩是否保留?
  10. 怎样追求一个你喜欢的人?
  11. 计算机二级费用报表,全国计算机二级ACESS 报表.doc
  12. linux shell解析1
  13. mysql列不与第一行的值匹配_MySQL和PHP错误:列数与第1行的值数不匹配
  14. ueditor 上传路径 Php_v9切换ueditor后图片上传路径问题 改成绝对路径
  15. 老旧小区智慧用电改造方案
  16. excel2013加载matlab宏,Matlab可以通过ActiveX在Excel文件中编写宏吗?
  17. 华为全球发布UMTS终端商用新品
  18. 基于Excel数据库的Cadence元件库管理
  19. 基于jsp,javaweb、ssm教务管理系统
  20. CAD二次开发合并所有能合并的线

热门文章

  1. 微信分享闪退的解决办法
  2. Mininet命令详解(1)
  3. 挣钱靠得是自己的能力!
  4. ListView异步加载图片,完美实现图文混排
  5. 关注各种高级语言虚拟机(high-level language virtual machine,HLL VM)的设计与实现,泛化至各种高级语言的运行时的设计与实现,也会涉及动态编译、GC、动态语言的编
  6. 软件测试100%(打包票必问)面试题:介绍下你做过得项目、学会必拿offer
  7. SFTP上传文件stalled Broken pipe
  8. App测试流程思维导图
  9. 用C语言实现高效嵌入式系统编程
  10. SQL查询计算近几天,近几个季度,近一年的数据