作者:Yan

Douglas Crockford 的方案:

//Crockford's approach adds the 'inherits' method
//to all functions, as well as a per-class method
//called 'uber' that allows you to make super calls.
Function.prototype.inherits = function(parent) {var d = 0, p = (this.prototype = new parent());this.prototype.uber = function(name) {var f, r, t = d, v = parent.prototype;if (t) {while (t) {v = v.constructor.prototype;t -= 1;}f = v[name];} else {f = p[name];if (f == this[name]) {f = v[name];}}d += 1;r = f.apply(this, Array.prototype.slice.apply(arguments, [1]));d -= 1;return r;};
};
function BaseClass() { }
BaseClass.prototype.getName = function() {return "BaseClass(" + this.getId() + ")";
}BaseClass.prototype.getId = function() {return 1;
}function SubClass() {}
SubClass.inherits(BaseClass);
SubClass.prototype.getName = function() {//Looks pretty clean and it calls//the getName() method of BaseClassreturn "SubClass(" + this.getId() + ") extends " +this.uber("getName");
}SubClass.prototype.getId = function() {return 2;
}function TopClass() {}
TopClass.inherits(SubClass);
TopClass.prototype.getName = function() {//Looks pretty clean and it calls//the getName() method of SubClassreturn "TopClass(" + this.getId() + ") extends " +this.uber("getName");
}TopClass.prototype.getId = function() {//Ok, so this.getId() should always//return the result of calling getId()//on SubClass, which is 2. So does it?return this.uber("getId");
}//Alerts "TopClass(2) extends SubClass(1) extends BaseClass(1)"
//Hmm... this.getId() didn't always return 2.
//What happened?
alert(new TopClass().getName());

Josh Gertzen 的方案,他指出了前面方案存在的问题,并给出他自己的方案:

//Defines the top level Class
function Class() { }
Class.prototype.construct = function() {};
Class.__asMethod__ = function(func, superClass) {  return function() {var currentSuperClass = this.$;this.$ = superClass;var ret = func.apply(this, arguments);      this.$ = currentSuperClass;return ret;};
};Class.extend = function(def) {var classDef = function() {if (arguments[0] !== Class) { this.construct.apply(this, arguments); }};var proto = new this(Class);var superClass = this.prototype;for (var n in def) {var item = def[n];                      if (item instanceof Function) {item = Class.__asMethod__(item, superClass);}proto[n] = item;}proto.$ = superClass;classDef.prototype = proto;//Give this new class the same static extend method    classDef.extend = this.extend;      return classDef;
};//Hey, this class definition approach
//looks much cleaner than then others.
var BaseClass = Class.extend({construct: function() { /* optional constructor method */ },getName: function() {return "BaseClass(" + this.getId() + ")";},getId: function() {return 1;}
});var SubClass = BaseClass.extend({getName: function() {//Calls the getName() method of BaseClassreturn "SubClass(" + this.getId() + ") extends " +this.$.getName.call(this);},getId: function() {return 2;}
});var TopClass = SubClass.extend({getName: function() {//Calls the getName() method of SubClassreturn "TopClass(" + this.getId() + ") extends " +this.$.getName.call(this);},getId: function() {//Much better, this.getId() always//returns the result of calling getId()//on SubClass, which is 2.        return this.$.getId.call(this);}
});//Alerts "TopClass(2) extends SubClass(2) extends BaseClass(2)"
//Everything looks good!
alert(new TopClass().getName());

javascript实现面向对象的继承相关推荐

  1. javascript 中面向对象实现 如何继承

    上一篇博客已经说了关于javascript中的封装, 其中也说了javascript中本来是没有类的,我们上一篇的封装也是用javascript中的函数去模拟一个类,最后我们还模拟了一个构造函数.那 ...

  2. 面向对象的 JavaScript:封装、继承与多态

    本文作者:家园工作室研发组成员 @维尔希宁 本文出处: 面向对象的 JavaScript:封装.继承与多态​blog.lenconda.top 本文遵循署名-非商业性使用-禁止演绎3.0 未本地化版本 ...

  3. JavaScript(JS) 面向对象(封装、继承、多态)

    面向对象是把事物给对象化,包括其属性和行为.面向对象编程更贴近实际生活的思想.可以简单的理解面向对象的底层还是面向过程,面向过程抽象成类,然后封装,方便使用就是面向对象.本文主要介绍JavaScrip ...

  4. javascript 的面向对象特性参考

    最近在看用javascript+css实现rich client.javascript 也是一个蛮有意思的语言.特别是其面向对象的实现和其他"标准"的OO launguage有很大 ...

  5. 【面试必备】javascript的原型和继承

    摘要: 原型.闭包.作用域等知识可以说是js中面试必考的东西,通过你理解的深度也就能衡量出你基本功是否扎实.今天来复习一下javascript的原型和继承,虽说是老生常谈的话题,但对于这些知识,自己亲 ...

  6. 理解JavaScript中的原型继承(2)

    两年前在我学习JavaScript的时候我就写过两篇关于原型继承的博客: 理解JavaScript中原型继承 JavaScript中的原型继承 这两篇博客讲的都是原型的使用,其中一篇还有我学习时的错误 ...

  7. 捋一捋js面向对象的继承问题

    说到面向对象这个破玩意,曾经一度我都处于很懵逼的状态,那么面向对象究竟是什么呢?其实说白了,所谓面向对象,就是基于类这个概念,来实现封装.继承和多态的一种编程思想罢了.今天我们就来说一下这其中继承的问 ...

  8. JavaScript 使用面向对象的技术创建高级 Web 应用程序

    最近,我面试了一个有五年 Web 应用程序开发经验的软件开发人员.四年半来她一直在从事 JavaScript 相关的工作,她自认为 JavaScript 技能非常好,但在不久之后我就发现实际上她对 J ...

  9. 进击的JavaScript(对象,继承,单例模式)

    1.   JavaScript的面向对象 怎么理解js的面向对象编程 面向对象:对外统一提供调用接口的编程思想. 对象: 依靠构造器(constructor)利用原型(prototype)构造出来. ...

最新文章

  1. 7-14 求整数段和 (C语言)
  2. 英特尔媒体年会场景(15P)——实拍与小结
  3. [RDLC]报表根据字段列动态加载图片(二)
  4. 【机器学习】机器学习模型验证,这3个 Python 包可轻松解决95%的需求!
  5. java class 是否相等_Java重要技术(30)类加载器之Class类型的相等比较
  6. 驱动开发之 设备读写方式:缓冲区方式
  7. linux修正磁盘错误,找到了linux分区顺序错乱修复方法
  8. python打开autocad软件_python 使用pyautocad操作AutoCAD
  9. 一将无能,累死三军!数据团队有“会说话”的好领导,有多重要?
  10. io 错误: socket closed_Tomcat NIO(9)IO线程Overall流程和关键类
  11. AcWing 847. 图中点的层次(BFS模板)
  12. 面向对象编程思想以及强、弱引用总结
  13. 有关 VS winform 开发问题
  14. java计算机毕业设计风情旅游网站源码+mysql数据库+系统+lw文档+部署
  15. python调用QT界面使用方法
  16. 林海峰讲的python_线性回归模型与最小二乘法(附python源码)
  17. java文件怎么保存_java 文件保存和打开
  18. MyBatis 插件之拦截器(Interceptor),拦截查询语句
  19. NodeMCU-ESP8266烧录手把手教程
  20. Visual Studio 2008 (vs 2008)简体中文专业版、团队版及SP1下载地址

热门文章

  1. EveryEeek English(9.21)
  2. [经典推荐]事半功倍系列之javascript
  3. dos命令操作mysql数据库的常用语句
  4. C#实现发送邮件的三种方法
  5. Android开发的之基本控件和详解四种布局方式
  6. 在C++中可以用3种方法访问一个字符串
  7. C++实现黑客帝国流星雨效果
  8. python和rpa有什么关系_什么是RPA_什么是RPA_产品简介_机器人流程自动化RPA - 阿里云...
  9. docker搭建webug4.0并——示范.支付漏洞,邮箱轰炸
  10. 利用SAML证书登陆vCenter