Javascript面向对象程序设计之二:继承
接下来我们要谈的两种实现继承的方法可能大家已经都很熟悉了,一种是原型继承法,一种是调用继承法,这两种方法都不会产生副作用。我们主要讨论的是这两种方法的本质和需要注意的地方。
一. 原型继承法
在 javascript 中,每一个类(函数)都有一个原型,该原型上的成员在该类实例化时,会传给该类的实例化对象。实例化的对象上没有原型,但是它可以作为另一个类(函数)的原型,当以该对象为原型的类实例化时,该对象上的成员就会传给以它为原型的类的实例化对象上。这就是原型继承的本质。
原型继承也是 javascript 中许多原生对象所使用的继承方法。
- function parentClass() {
- // private field
- var x = "I'm a parentClass field!";
- // private method
- function method1() {
- alert(x);
- alert("I'm a parentClass method!");
- }
- // public field
- this.x = "I'm a parentClass object field!";
- // public method
- this.method1 = function() {
- alert(x);
- alert(this.x);
- method1();
- }
- }
- parentClass.prototype.method = function () {
- alert("I'm a parentClass prototype method!");
- }
- parentClass.staticMethod = function () {
- alert("I'm a parentClass static method!");
- }
-
- function subClass() {
- // private field
- var x = "I'm a subClass field!";
- // private method
- function method2() {
- alert(x);
- alert("I'm a subClass method!");
- }
- // public field
- this.x = "I'm a subClass object field!";
- // public method
- this.method2 = function() {
- alert(x);
- alert(this.x);
- method2();
- }
- this.method3 = function() {
- method1();
- }
- }
-
- // inherit
- subClass.prototype = new parentClass();
- subClass.prototype.constructor = subClass;
-
- // test
- var o = new subClass();
-
- alert(o instanceof parentClass); // true
- alert(o instanceof subClass); // true
-
- alert(o.constructor); // function subClass() {...}
-
- o.method1(); // I'm a parentClass field!
- // I'm a subClass object field!
- // I'm a parentClass field!
- // I'm a parentClass method!
- o.method2(); // I'm a subClass field!
- // I'm a subClass object field!
- // I'm a subClass field!
- // I'm a subClass method!
- o.method(); // I'm a parentClass prototype method!
-
- o.method3(); // Error!!!
- subClass.staticMethod(); // Error!!!
上面这个例子很好的反映出了如何利用原型继承法来实现继承。
利用原型继承的关键有两步操作:
首先创建一个父类的实例化对象,然后将该对象赋给子类的 prototype 属性。
这样,父类中的所有公有实例成员都会被子类继承。并且用 instanceof 运算符判断时,子类的实例化对象既属于子类,也属于父类。
然后将子类本身赋值给它的 prototype 的 constructor 属性。(注意:这里赋值的时候是没有 () 的!)
这一步是为了保证在查看子类的实例化对象的 constructor 属性时,看到的是子类的定义,而不是其父类的定义。
接下来,通过对 o.method1() 调用的结果我们会看到,子类继承来的公有实例方法中,如果调用了私有实例字段或者私有实例方法,则所调用的这些私有实例成员是属于父类的。
同样,通过对 o.method2() 调用的结果我们看到,子类中定义的实例方法,如果调用了私有实例字段或者私有实例方法,则所调用的这些私有实例成员是属于子类的。
通过对 o.method() 调用的结果我们看到,定义在父类原型上的方法,会被子类继承。
通过对 o.method3() 调用的结果我们看到,子类中定义的实例方法是不能访问父类中定义的私有实例成员的。
最后,通过对 subClass.staticMethod() 调用的结果我们看到,静态成员是不会被继承的。
二.调用继承法
调用继承的本质是,在子类的构造器中,让父类的构造器方法在子类的执行上下文上执行,父类构造器方法上所有通过 this 方式操作的内容实际上都都是操作的子类的实例化对象上的内容。因此,这种做法仅仅为了减少重复代码的编写。
- function parentClass() {
- // private field
- var x = "I'm a parentClass field!";
- // private method
- function method1() {
- alert(x);
- alert("I'm a parentClass method!");
- }
- // public field
- this.x = "I'm a parentClass object field!";
- // public method
- this.method1 = function() {
- alert(x);
- alert(this.x);
- method1();
- }
- }
- parentClass.prototype.method = function () {
- alert("I'm a parentClass prototype method!");
- }
-
- parentClass.staticMethod = function () {
- alert("I'm a parentClass static method!");
- }
-
- function subClass() {
- // inherit
- parentClass.call(this);
-
- // private field
- var x = "I'm a subClass field!";
- // private method
- function method2() {
- alert(x);
- alert("I'm a subClass method!");
- }
- // public field
- this.x = "I'm a subClass object field!";
- // public method
- padding-top: 0px; padding-right: 0px; p
分享到:
相关推荐
JavaScript程序设计 面向过程与面向对象 6.1.1 面向过程与面向对象 1、概念 面向过程(Procedure Oriented)也可称之为“面向记录”,是一种以过程为中心的编程思想。它注重的是具体的步骤,只有按照步骤一步一步...
在JavaScript面向对象编程中,随着Web2.0和Ajax技术的普及,JavaScript的角色从简单的表单验证扩展到了复杂的数据交互和页面动态更新。采用面向对象的编程风格可以使代码结构更加清晰,便于管理和维护。例如,...
Java面向对象程序设计是计算机科学中的一个重要主题,尤其在Java编程中。邢国波的《Java面向对象程序设计》一书旨在帮助读者理解和掌握Java语言的核心特性,特别是面向对象编程的概念。以下是根据提供的内容和标签...
本章将深入探讨JavaScript中的面向对象程序设计。 首先,JavaScript中的类是通过函数来定义的。一个函数不仅可以作为一个独立的执行单元,也可以作为类的构造函数,用来初始化新创建的对象。例如: ```javascript ...
由于JS不是纯的面向对象的语言,所以对象的继承是以原型函数的形式继承的,很多人刚开始接触的时候不太理解,但是JS这种以原型函数的形式实现面向对象技术,不仅是可行的,而且还为面向对象技术提供了动态继承的功能...
《JavaScript面向对象编程指南》内容包括:JavaScript作为一门浏览器语言的..., 《JavaScript面向对象编程指南》着重介绍JavaScript在面向对象方面的特性,展示如何构建强健的、可维护的、功能强大的应用程序及程序库。
基于JavaScript的面向对象程序设计研究 本文对基于JavaScript的面向对象程序设计进行了深入研究。研究发现,JavaScript语言具有良好的面向对象特性,特别是在封装性、继承性和多态性等方面。本文对JavaScript的面向...
本文实例讲述了Javascript面向对象程序设计继承用法。分享给大家供大家参考,具体如下: 1.关于继承: 百度百科对继承的解释是:继承是指一个对象直接使用另一对象的属性和方法。 (话说百科对于计算机概念的继承的...
JavaScript是一种广泛...通过深入学习这本《JavaScript面向对象编程指南(第2版)》,开发者不仅能掌握JavaScript的面向对象编程基础,还能了解到实际项目中如何有效地运用这些知识,提升编程技巧和解决问题的能力。
JavaScript作为一门浏览器语言的核心思想;面向对象编程的基础知识及其在... 《JavaScript面向对象编程指南》着重介绍JavaScript在面向对象方面的特性,展示如何构建强健的、可维护的、功能强大的应用程序及程序库
面向对象程序设计(Object-Oriented Programming,简称OOP)是软件工程中的一个重要概念,它通过类和对象来组织代码,实现数据封装、继承和多态等核心特性。在JavaScript中,虽然没有传统的类,但它提供了基于原型的...
JavaScript是一种广泛应用于Web开发的脚本语言,尤其在构建交互式网页和...这份"JavaScript面向对象程序程序设计PPT与代码"资源将详细解释这些概念,并可能包含实际示例,帮助你深入理解和应用这些面向对象编程技术。
标题“JavaScript经典面向对象设计”指出了本书的主要内容是关于如何使用面向对象编程(OOP)原则和技术来编写高质量、可扩展且可重用的JavaScript应用程序及库。描述中提到本书相比其他中文资料更为清晰,深入到...
JavaScript,作为一种广泛应用...JavaScript 面向对象程序设计——继承与多态.pdf 和 JavaScript 面向对象程序设计——封装.pdf 这两个文档可能深入探讨了这些主题,帮助读者深入理解并掌握JavaScript的面向对象开发。
### JavaScript面向对象编程知识点概述 #### 一、现代JavaScript编程概览 - **JavaScript的演进**:自诞生以来,JavaScript经历了从一个简单的脚本语言到现今被广泛应用于构建复杂应用的强大编程语言的过程。它的...
### 论述面向对象程序设计的必然性以及未来形势 #### 面向对象程序设计的必然性 面向对象程序设计(Object-Oriented Programming,简称OOP)是一种编程范式,它通过将数据和处理数据的方法绑定在一起,形成一个...
在JavaScript的面向对象编程中,由于它本身并不支持传统的类概念,而是基于原型(prototype)的对象模型,因此理解和掌握对象的定义与继承至关重要。本文将深入探讨如何在JavaScript中定义对象以及实现对象间的继承...