Javascript面向对象程序设计之三:多态
重载和覆盖
先来说明一下重载和覆盖的区别。重载的英文是 overload,覆盖的英文是 override。发现网上大多数人把 override 当成了重载,这个是不对的。重载和覆盖是有区别的。
重载的意思是,同一个名字的函数(注意这里包括函数)或方法可以有多个实现,他们依靠参数的类型和(或)参数的个数来区分识别。
覆盖的意思是,子类中可以定义与父类中同名,并且参数类型和个数也相同的方法,这些方法的定义后,在子类的实例化对象中,父类中继承的这些同名方法将被隐藏。
一.重载
javascript 中函数的参数是没有类型的,并且参数个数也是任意的,例如,尽管你可以定义一个:
- function add(a, b) {
- return a + b;
- }
这样的函数,但是你仍然可以再调用它是带入任意多个参数,当然,参数类型也是任意的。至于是否出错,那是这个函数中所执行的内容来决
定的,javascript 并不根据你指定的参数个数和参数类型来判断你调用的是哪个函数。
因此,要定义重载方法,就不能像强类型语言中那样做了。但是你仍然可以实现重载。就是通过函数的 arguments 属性。例如:
- function add() {
- var sum = 0;
- for (var i = 0; i < arguments.length; i++) {
- sum += arguments[i];
- }
- return sum;
- }
这样你就实现了任意多个参数加法函数的重载了。
当然,你还可以在函数中通过 instanceof 或者 constructor 来判断每个参数的类型,来决定后面执行什么操作,实现更为复杂的函数或方法重载。总之,javascript 的重载,是在函数中由用户自己通过操作 arguments 这个属性来实现的。
二.覆盖
实现覆盖也很容易,例如:
- function parentClass() {
- this.method = function() {
- alert("parentClass method");
- }
- }
- function subClass() {
- this.method = function() {
- alert("subClass method");
- }
- }
- subClass.prototype = new parentClass();
- subClass.prototype.constructor = subClass;
-
- var o = new subClass();
- o.method();
这样,子类中定义的 method 就覆盖了从父类中继承来的 method 方法了。
你可能会说,这样子覆盖是不错,但 java 中,覆盖的方法里面可以调用被覆盖的方法(父类的方法),在这里怎么实现呢?也很容易,而且
比 java 中还要灵活,java 中限制,你只能在覆盖被覆盖方法的方法中才能使用 super 来调用次被覆盖的方法。我们不但可以实现这点,而
且还可以让子类中所有的方法中都可以调用父类中被覆盖的方法。看下面的例子:
- function parentClass() {
- this.method = function() {
- alert("parentClass method");
- }
- }
- function subClass() {
- var method = this.method;
- this.method = function() {
- method.call(this);
- alert("subClass method");
- }
- }
- subClass.prototype = new parentClass();
- subClass.prototype.constructor = subClass;
-
- var o = new subClass();
- o.method();
你会发现,原来这么简单,只要在定义覆盖方法前,定义一个私有变量,然后把父类中定义的将要被覆盖的方法赋给它,然后我们就可以在后
面继续调用它了,而且这个是这个方法是私有的,对于子类的对象是不可见的。这样跟其它高级语言实现的覆盖就一致了。
最后需要注意,我们在覆盖方法中调用这个方法时,需要用 call 方法来改变执行上下文为 this(虽然在这个例子中没有必要),如果直接调
用这个方法,执行上下文就会变成全局对象了。
分享到:
相关推荐
在JavaScript面向对象编程中,随着Web2.0和Ajax技术的普及,JavaScript的角色从简单的表单验证扩展到了复杂的数据交互和页面动态更新。采用面向对象的编程风格可以使代码结构更加清晰,便于管理和维护。例如,...
JavaScript,作为一种广泛应用...JavaScript 面向对象程序设计——继承与多态.pdf 和 JavaScript 面向对象程序设计——封装.pdf 这两个文档可能深入探讨了这些主题,帮助读者深入理解并掌握JavaScript的面向对象开发。
JavaScript是一种广泛...通过深入学习这本《JavaScript面向对象编程指南(第2版)》,开发者不仅能掌握JavaScript的面向对象编程基础,还能了解到实际项目中如何有效地运用这些知识,提升编程技巧和解决问题的能力。
面向对象程序设计(Object-Oriented Programming,简称OOP)是软件工程中的一个重要概念,它通过类和对象来组织代码,实现数据封装、继承和多态等核心特性。在JavaScript中,虽然没有传统的类,但它提供了基于原型的...
### JavaScript面向对象编程知识点概述 #### 一、现代JavaScript编程概览 - **JavaScript的演进**:自诞生以来,JavaScript经历了从一个简单的脚本语言到现今被广泛应用于构建复杂应用的强大编程语言的过程。它的...
总而言之,学习现代JavaScript面向对象编程,有助于开发者在认识这门语言演化的基础上,运用面向对象的设计和编程模式来构建更加健壮和可维护的JavaScript应用程序。同时,测试和调试是保证代码质量不可或缺的环节,...
本文旨在深入解析JavaScript面向对象编程的基础,包括对象的基本概念、类与对象的关系、对象的属性与方法、封装、继承与多态,以及JavaScript中对象的实现方式。 #### 对象的基本概念 面向对象编程的核心在于对...
下面将详细探讨JavaScript面向对象编程的基本原理、特性以及实际应用。 1. **类与对象** - 在JavaScript中,对象是键值对的集合,可以通过字面量语法或构造函数创建。例如: ```javascript const person = { ...
JavaScript是一种广泛应用于Web开发的动态、弱类型、基于原型的脚本语言,它不仅支持函数式编程,还具有强大的面向对象编程能力...通过阅读《javascript面向对象编程.pdf》这样的资料,你可以深入理解并掌握这些概念。
在"java 面向对象程序设计课件"中,我们可以深入探讨以下几个关键知识点: 1. **面向对象编程基础**:Java是面向对象的语言,其核心概念包括封装、继承和多态。封装允许我们将数据和操作数据的方法捆绑在一起,形成...
在当今的软件开发中,JavaScript语言因其在Web前端开发中的广泛应用而变得极其重要。...通过理解这些概念和实践知识,开发者可以在进行JavaScript面向对象高级编程时,设计出更加合理、易于维护和扩展的应用程序。
### JavaScript面向对象精要 #### 一、概述 《JavaScript面向对象精要》是一本深入讲解JavaScript面向对象编程原理的专业书籍。本书由知名的前端开发者Nicholas C. Zakas撰写,全面介绍了JavaScript作为一种动态...
### 面向对象分析设计参考案例:网上书店系统WebLab #### 一、面向对象的概念及重要性 面向对象编程(Object-Oriented Programming,简称OOP)是一种软件开发方法,它通过“对象”这一基本单位来组织代码。对象是...
### JavaScript面向对象编程指南 #### 一、面向对象编程(OOP)简介 面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它通过“对象”这一概念来设计软件。在OOP中,对象是数据和操作这些数据...
面向对象程序设计的基本原则包括封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism),这被称为面向对象的三大特性。封装是隐藏对象内部状态和行为的过程,只暴露出操作接口。继承是子对象继承父对象...
"Java面向对象程序设计实验课的心得体会" 本文通过对 Java 面向对象程序设计实验课的学习和实践,探索了 Java 的重要性和面向对象编程思想的应用。作者通过实验课的学习,逐步熟悉了 Java 编程思想,掌握了基本技巧...
【Java语言与面向对象程序设计】 面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它的核心思想是将现实世界中的实体抽象为对象,通过对象来解决问题。Java是一种典型的面向对象编程语言,它在...