`
nomadyyj
  • 浏览: 53658 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

javascript学习笔记(七)---继承的实现

    博客分类:
  • js
阅读更多

ECMAScript 中实现继承的方式不止一种。这是因为 JavaScript 中的继承机制并不是明确规定的,而是通过模仿实现的。这意味着所有的继承细节并非由解释程序处理。

 

对象冒充--- 构造函数使用 this 关键字给所有属性和方法赋值(即采用类声明的构造函数方式)。因为构造函数只是一个函数,所以可使 ClassA 的构造函数成为 ClassB 的方法,然后调用它。 ClassB 就会收到 ClassA 的构造函数中定义的属性和方法。

function ClassA(sColor){
	this.color = sColor;
	this.sayColor = function (){
		alert(this.color);
	}
}

function ClassB(sColor,sName){
	this.newMethod = ClassA;	//为ClassA赋予了方法newMethod
	this.newMethod(sColor);		//调用newMethod
	delete this.newMethod;		//删除对ClassA的引用

	this.name = sName;
	this.sayName = function(){
		alert(this.name);
	}
}

 

 所有的新属性和新方法都必须在删除了新方法的代码行后定义。否则,可能会覆盖超类的相关属性和方法.

 可以实现多继承

 

call() 方法--- 与经典的对象冒充方法相似, 第一个参数用作 this 的对象。其他参数都直接传递给函数自身。

function ClassA(sColor){
	this.color = sColor;
	this.sayColor = function (){
		alert(this.color);
	}
}

function ClassB(sColor,sName){
	ClassA.call(this,sColor);  //this让ClassA中的关键字this等于新创建的ClassB对象
						//第二个参数sColor对两个类来说都是唯一的参数。
	this.name = sName;
	this.sayName = function(){
		alert(this.name);
	}
}
 

apply() 方法--- 与call()相似,两个参数,用作 this 的对象和要传递给函数的参数的数组。

function ClassA(sColor){
	this.color = sColor;
	this.sayColor = function (){
		alert(this.color);
	}
}

function ClassB(sColor,sName){
	ClassA.apply(this,arguments);//只有超类中的参数顺序与子类中的参数顺序完全一致时才可以传递参数对象
	ClassA.apply(this,new Array(sColor));//如果不是,就必须创建一个单独的数组,按照正确的顺序放置参数。

	this.name = sName;
	this.sayName = function(){
		alert(this.name);
	}
}

 

原型链--- 用另一类型的对象重写类的 prototype 属性。

prototype 对象的任何属性和方法都被传递给那个类的所有实例。 子类的所有属性和方法都必须出现在 prototype 属性被赋值后,因为在它之前赋值的所有方法都会被删除。

缺点:使用原型链,就无法使用带参构造函数了

function ClassA(){
}

ClassA.prototype.name = "nomad";
ClassA.prototype.sayName = function(){
	alert(this.name);
}

function ClassB()
}
ClassB.prototype = new ClassA(); //要确保调用构造函数没有任何参数。

ClassB.prototype.age = 23;
ClassB.prototype.sayAge = function(){
	alert(this.age);
}
 

混合方式--- 对象冒充继承构造函数的属性,用原型链继承 prototype 对象的方法。

function ClassA(aName){
	this.name = aName;
}

ClassA.prototype.sayName = function(){
	alert(this.name);
}

function ClassB(aName,aAge){
	ClassA.call(this,aName);
}

ClassB.prototype = new ClassA();

ClassB.prototype.sayAge = function(){
	alert(this.age);
}
 

其他继承方式:

zInherit 库( http://www.nczonline.net/downloads ): 支持所有的现代浏览器( Mozilla IE Opera Safari )及一些旧的浏览器( Netscape 4.x IE Mac )。(需要引入 zinherit.js (见附件))

 

zInherit 库给 Object 类添加了两个方法:

----inheritFrom(): 负责复制指定类的所有方法, 接受一个参数,即要复制的方法所属的类

----instanceOf(): instanceof 运算符的替代品

<script type="text/javascript" src="~/zinherit.js"></script>
function ClassA(){
}

ClassA.prototype.name = "nomad";
ClassA.prototype.sayName = function(){
	alert(this.name);
}

function ClassB(){
}

ClassB.prototype.inheritFrom(ClassA); 

ClassB.prototype.age = 23;
ClassB.prototype.sayAge = function(){
	alert(this.age);
}

 

 

xbObjects: JavaScript 提供更强的面向对象范型,不止支持继承,还支持方法的重载和调用超类方法的能力。

 (xbObjects.js见附件)

 

几个方法:

--registerClass(className, parentClassName):参数以字符串形式传递,如父类不明确,可以只用第一个参数

--defineClass(className, prototype_func):className为字符串形式的类名,prototype_func为函数指针(函数名)

--parentMethod(method,args...):接受任意多个参数,但第一个参数总是要调用的父类方法的名字(该参数必须是字符串,而不是函数指针),所有其他参数都被传给父类的方法。

---

//1,必须注册类
_classes.registerClass("Polygon");

function Polygon(iSides) {
    //2,在构造函数内调用defineClass()方法
    _classes.defineClass("Polygon", prototypeFunction);
    //3,
    this.init(iSides);
   
   //该函数用于初始化对象的所有属性和方法
    function prototypeFunction() {
    
        Polygon.prototype.init = function(iSides) {
            this.parentMethod("init");
            this.sides = iSides;            
        };
    
        Polygon.prototype.getArea = function () {
            return 0;
        };    
    
    }
}

_classes.registerClass("Triangle", "Polygon");

function Triangle(iBase, iHeight) {

    _classes.defineClass("Triangle", prototypeFunction);
    
    this.init(iBase,iHeight);
    
    function prototypeFunction() {
        Triangle.prototype.init = function(iBase, iHeight) {
            this.parentMethod("init", 3);
            this.base = iBase;
            this.height = iHeight;
        };
        
        Triangle.prototype.getArea = function () {
            return 0.5 * this.base * this.height;
        };    
    }
    
}

_classes.registerClass("Rectangle", "Polygon");

function Rectangle(iLength, iWidth) {

    _classes.defineClass("Rectangle", prototypeFunction);
    
    this.init(iLength, iWidth);
    
    function prototypeFunction() {
        Rectangle.prototype.init = function(iLength, iWidth) {
            this.parentMethod("init", 4);
            this.length = iLength;
            this.width = iWidth;
        }
    
       Rectangle.prototype.getArea = function () {
            return this.length * this.width;
       };    
        
    }
}
 

 

  • zinherit.rar (1.2 KB)
  • 描述: zInherit.js
  • 下载次数: 32
分享到:
评论
2 楼 smalljeff 2008-07-25  
眼熟。
这东西放到自己博客上就行了。
1 楼 prcjack 2008-06-22  
引用:原型链--- 缺点:使用原型链,就无法使用带参构造函数了
其实是可以使用带参构造函数的:
ClassB.prototype = new ClassA();
改成:ClassB.prototype = new ClassA;就可以的了

相关推荐

    JavaScript高级程序设计2,学习笔记---第一篇

    这篇学习笔记将带你探索JavaScript的核心概念,包括变量、数据类型、控制流、函数、对象和类等,这些都是构建复杂应用程序的基础。 首先,我们要了解JavaScript的基础语法。在JavaScript中,变量是存储数据的容器,...

    JavaScript学习笔记

    本学习笔记旨在帮助初学者快速掌握JavaScript的核心概念和技术,实现从入门到精通的过渡。 1. **基础语法** - 变量声明:JavaScript支持var、let和const关键字声明变量,理解它们的作用域和提升特性至关重要。 - ...

    javascript学习笔记.docx

    这篇学习笔记主要涵盖了JavaScript的基础语法和客户端JavaScript的相关知识。 1. **JavaScript基本语法**: - **变量声明**:未声明的变量尝试读取时会产生错误,而写入未声明的变量会创建一个全局变量。 - **...

    第四章(js高级程序设计学习笔记)----2

    在本节中,我们将深入探讨JavaScript的高级程序设计,特别是关注"第四章(js高级程序设计学习笔记)----2"的主题。这一章很可能涵盖了JavaScript的核心概念,包括原型链(Prototype Chaining)。通过阅读名为...

    javascript入门学习笔记

    这份"javascript入门学习笔记"旨在为初学者提供一个全面且深入的JavaScript学习路径。 一、基础语法 JavaScript的基础包括变量、数据类型、操作符、流程控制等。变量用于存储数据,数据类型分为基本类型(如字符串...

    Javascript高级程序设计---笔记归类.pdf

    JavaScript,作为一种广泛应用于Web...总之,这份笔记归类详尽地梳理了JavaScript的高级特性,是深入学习和提升JavaScript技能的重要参考资料。理解并掌握这些知识点,对于成为一个高效的JavaScript开发者至关重要。

    JavaScript基础笔记-尚硅谷视频自己总结

    - 微软公司也在其浏览器IE3中引入了自己的JavaScript实现——JScript。 - 为了统一标准,几个主要的软件公司合作制定了ECMAScript标准。 #### 三、JavaScript的核心组成部分 - **ECMAScript**: 定义了语言的...

    js 笔记 javascript 学习笔记

    本学习笔记将深入探讨JavaScript的核心概念,包括变量、数据类型、操作符、控制流程、函数、对象、数组、原型链、闭包等,并结合实际示例,如my.js、order.js、login.js等文件,来讲解其在实际项目中的应用。...

    JavaScript-学习笔记.docx

    JavaScript是一种广泛应用...以上就是JavaScript学习笔记中的主要知识点,理解和掌握这些内容对于深入学习JavaScript至关重要。在实际编程中,还需要结合具体的场景灵活运用,并不断实践和探索更高级的特性和最佳实践。

    JavaScript基础教程笔记

    ### JavaScript基础教程笔记知识点 #### 一、JavaScript简介 - **定义**:JavaScript是一种轻量级的编程语言,主要用于Web浏览器中的网页交互控制。 - **发展历史**:1995年由Netscape公司的Brendan Eich设计并...

    Javascript高级程序设计---笔记.pdf

    以上只是JavaScript高级程序设计中的一部分内容,实际的学习笔记会更深入地探讨这些主题,包括异常处理、作用域链、闭包、异步编程(如回调函数、Promise、async/await)、模块系统(CommonJS、ES modules)、正则...

    java学习笔记-html-ssh-js

    【Java学习笔记】 在Java的学习旅程中,深入理解其核心概念是至关重要的。Java是一种广泛使用的面向对象的编程语言,以其跨平台性、高效性和稳定性而受到青睐。本笔记集合将带你逐步走进Java的世界,从基础语法到...

    我的javascript学习笔记

    根据提供的文件信息,可以看出这份“我的javascript学习笔记”主要涵盖了JavaScript中的几个关键概念和技术要点,包括正则表达式、AJAX以及一些JavaScript的核心语言特性。接下来将这些知识点进行详细的整理和解释。...

    javaScript学习笔记.rar

    这个“javaScript学习笔记.rar”压缩包显然包含了作者在学习JavaScript过程中的心得和记录,对于初学者或者想要深入理解JavaScript的人来说,是一份宝贵的资源。 JavaScript与Java虽然名字相似,但两者实际上是不同...

    JavaScript 入门 新手学习笔记

    这篇"JavaScript入门新手学习笔记"提供了全面的学习资源,适合初学者系统性地掌握这一技术。 笔记可能包含了以下关键知识点: 1. **基础语法**:JS的基础包括变量(var、let、const)、数据类型(如字符串、数字、...

    跟李彦恢学javascript 电子书和课堂笔记1-15章.rar

    本书涵盖了1-15章的内容,这意味着读者将能够学习到JavaScript的核心概念,包括但不限于: 1. **基础语法**:变量声明(var、let、const)、数据类型(字符串、数字、布尔、null、undefined、对象、数组)、运算符...

    狂神说系列 JavaScript笔记

    【狂神说系列 JavaScript笔记】是一份全面且深入的JavaScript学习资源,旨在帮助开发者和初学者深入理解这门广泛应用于Web开发的脚本语言。这份笔记涵盖了JavaScript的基础语法、核心概念以及高级特性,旨在构建一个...

    JavaScript学习笔记 概括了所有的javaScript语法 用法

    本学习笔记全面涵盖了JavaScript的语法和用法,旨在帮助初学者快速掌握并深入理解这门语言。 一、基础语法 JavaScript的基础包括变量、数据类型、操作符和流程控制。变量在JavaScript中使用`let`、`const`和`var`...

    javascript学习笔记

    在本"JavaScript学习笔记"中,我们将探讨JavaScript的核心概念、语法特性、DOM操作以及常见应用。 1. **基础语法** - 变量声明:JavaScript使用`var`、`let`和`const`进行变量声明,其中`let`和`const`是ES6新增的...

Global site tag (gtag.js) - Google Analytics