javascript实现面向对象的继承
作者: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实现面向对象的继承相关推荐
- javascript 中面向对象实现 如何继承
上一篇博客已经说了关于javascript中的封装, 其中也说了javascript中本来是没有类的,我们上一篇的封装也是用javascript中的函数去模拟一个类,最后我们还模拟了一个构造函数.那 ...
- 面向对象的 JavaScript:封装、继承与多态
本文作者:家园工作室研发组成员 @维尔希宁 本文出处: 面向对象的 JavaScript:封装.继承与多态blog.lenconda.top 本文遵循署名-非商业性使用-禁止演绎3.0 未本地化版本 ...
- JavaScript(JS) 面向对象(封装、继承、多态)
面向对象是把事物给对象化,包括其属性和行为.面向对象编程更贴近实际生活的思想.可以简单的理解面向对象的底层还是面向过程,面向过程抽象成类,然后封装,方便使用就是面向对象.本文主要介绍JavaScrip ...
- javascript 的面向对象特性参考
最近在看用javascript+css实现rich client.javascript 也是一个蛮有意思的语言.特别是其面向对象的实现和其他"标准"的OO launguage有很大 ...
- 【面试必备】javascript的原型和继承
摘要: 原型.闭包.作用域等知识可以说是js中面试必考的东西,通过你理解的深度也就能衡量出你基本功是否扎实.今天来复习一下javascript的原型和继承,虽说是老生常谈的话题,但对于这些知识,自己亲 ...
- 理解JavaScript中的原型继承(2)
两年前在我学习JavaScript的时候我就写过两篇关于原型继承的博客: 理解JavaScript中原型继承 JavaScript中的原型继承 这两篇博客讲的都是原型的使用,其中一篇还有我学习时的错误 ...
- 捋一捋js面向对象的继承问题
说到面向对象这个破玩意,曾经一度我都处于很懵逼的状态,那么面向对象究竟是什么呢?其实说白了,所谓面向对象,就是基于类这个概念,来实现封装.继承和多态的一种编程思想罢了.今天我们就来说一下这其中继承的问 ...
- JavaScript 使用面向对象的技术创建高级 Web 应用程序
最近,我面试了一个有五年 Web 应用程序开发经验的软件开发人员.四年半来她一直在从事 JavaScript 相关的工作,她自认为 JavaScript 技能非常好,但在不久之后我就发现实际上她对 J ...
- 进击的JavaScript(对象,继承,单例模式)
1. JavaScript的面向对象 怎么理解js的面向对象编程 面向对象:对外统一提供调用接口的编程思想. 对象: 依靠构造器(constructor)利用原型(prototype)构造出来. ...
最新文章
- 7-14 求整数段和 (C语言)
- 英特尔媒体年会场景(15P)——实拍与小结
- [RDLC]报表根据字段列动态加载图片(二)
- 【机器学习】机器学习模型验证,这3个 Python 包可轻松解决95%的需求!
- java class 是否相等_Java重要技术(30)类加载器之Class类型的相等比较
- 驱动开发之 设备读写方式:缓冲区方式
- linux修正磁盘错误,找到了linux分区顺序错乱修复方法
- python打开autocad软件_python 使用pyautocad操作AutoCAD
- 一将无能,累死三军!数据团队有“会说话”的好领导,有多重要?
- io 错误: socket closed_Tomcat NIO(9)IO线程Overall流程和关键类
- AcWing 847. 图中点的层次(BFS模板)
- 面向对象编程思想以及强、弱引用总结
- 有关 VS winform 开发问题
- java计算机毕业设计风情旅游网站源码+mysql数据库+系统+lw文档+部署
- python调用QT界面使用方法
- 林海峰讲的python_线性回归模型与最小二乘法(附python源码)
- java文件怎么保存_java 文件保存和打开
- MyBatis 插件之拦截器(Interceptor),拦截查询语句
- NodeMCU-ESP8266烧录手把手教程
- Visual Studio 2008 (vs 2008)简体中文专业版、团队版及SP1下载地址
热门文章
- EveryEeek English(9.21)
- [经典推荐]事半功倍系列之javascript
- dos命令操作mysql数据库的常用语句
- C#实现发送邮件的三种方法
- Android开发的之基本控件和详解四种布局方式
- 在C++中可以用3种方法访问一个字符串
- C++实现黑客帝国流星雨效果
- python和rpa有什么关系_什么是RPA_什么是RPA_产品简介_机器人流程自动化RPA - 阿里云...
- docker搭建webug4.0并——示范.支付漏洞,邮箱轰炸
- 利用SAML证书登陆vCenter