`
xiang588
  • 浏览: 313626 次
  • 性别: Icon_minigender_1
  • 来自: 甘肃平凉
社区版块
存档分类
最新评论

javascript 的面向对象特性参考

阅读更多

最近在看用javascript+css实现rich client。javascript 也是一个蛮有意思的语言。特别是其面向对象的实现和其他“标准”的OO launguage有很大的不同。但是,都是动态语言,我还是觉得它比起python语法和库都差得太远。可是没有explorer支持python开发啊。。。:(

这是我学习javascript中面向对象特性的一点总结。希望对具有其他语言的面向对象设计经验的朋友理解javascript的OO有所帮助。我具有c++,java和python的面向对象设计的经验。

总的感受, javascript作为一种弱类型的动态语言,语法接近于java,但其面向对象的方式更和python相识。

1 面向对象的特性

类,成员变量,成员函数,类变量,类方法,继承,多态

1) 类

类的定义:function Circle(r) { this.r = r; }

类的实例化: c = Circle(3);

2)成员变量

成员变量在初始化函数里申明:this.r = r;

注意,在对象生成后,你也可以给它附上成员变量,比如c.name="my circle",

但是除非特别的需要,我强烈建议你不要这样做。也就是所有的成员都应在初始化函数里声明。我认为这是一种好的style。

这一点和python很相识。

3)成员函数

成员函数的标准形式是这样的:

Cricle.prototype.area = function() { return 3.14 * this.r * this.r; }

这和java或python或c++都大不一样。但为了帮助理解,你可以把prototype看作基类。

prototype里面的变量或方法,是所有对象共享的。

比如,c.area()调用最终就会让解释器调用到Circle.prototype.area().

相比于java和c++,javascript具有他们都没有的一个语义,也就是你可以在prototype里定义变量。定义在prototype里的变量可以被所有的实例共享量。所以一般它应该是一个常数,比如:Circle.prototype.PI = 3.14.

显然,prototype里的变量和方法都应该是不变的。每一个对象实例都不应该取修改prototype中的内容。虽然语言允许你可以这样做,但这样做没有任何意义,也违反了面向对象的语义(想想,java会让你动态修改一个类的方法吗)。

当然,对于多态是另外一回事,在后面详述。

而且,我建议所有的成员函数都在紧接类定义的地方定义。而不应该在代码运行的某个地方对一个对象实例增加/修改成员函数。这样的结果是javascript的类定义尽量向java看齐。使得代码更清晰。

4)类变量

类变量是属于一个类的变量。就像java里用static修饰的变量。因为它属于类,所以它也应该是一个常量。实例不应该去修改它,虽然你可以(java里可以用final修饰,使得类变量一旦定义,就不能修改)。这里可以看到,类变量和prototype里定义的变量的功能是相似的。确实如此,他们的目的都是一样的。但他们的访问方式

不一样。比如:

Circle.prototype.PI = 3.14;

Circle.PI = 3.14;

//用prototype里的变量

Circle.prototype.area1 = function() { return this.PI * this.r * this.r; }

//用类变量

Circle.prototype.area2 = function() { return Circle.PI * this.r * this.r; }

5)类方法

这个概念应该很简单。注意类方法里绝对不要用this关键字,和java完全一样。

Circle.max = function(a, b) {
    return a.r > b.r ? a : b; 
}

theMax = Circle(new Circle(1), new Circle(4));

6)继承

子类继承父类,那么 “子类实例” 具有和 “父类实例” 完全一样的行为。javascript是这样实现的。

function SubCircle(x, y, r) { 
  this.x = x;
  this.y = y;
  this.r =r;
}

SubCircle.prototype = new Circle(0);
记得前面说的吗?可以把prototype看作一个基类。这里,prototype确确实实是一个基类。它是如何实现的呢?

举例如下:
sc = SubCirlce(1,1,3); 
sc.area();

调用的传递:
sc.area()->sc.prototype.area()->Circle(0).area()->Circle.prototype.area().
看来是不是很奇妙呢。

通过这种方式,javascript实现了继承。

7)多态

多态是子类会定义和父类具有相同signature的方法。假设在SubCircle所在的空间PI=100,而面积公式也变为 PI*R*R*R。

SubCircle.prototype.PI = 100

SubCircle.prototype.area = function() {
   return this.PI*this.r*this.r*this.r; 
}
Sc.area()

这样的操作可以认为是:

Sc.PI->sc.prototype.PI->Cricle(0).PI = 100

Sc.area()->sc.prototype.area()->Circle(0).area.
这个时候,调用过程是这样的

sc.area()->sc.prototype.area(),在这里解释器发现了area这个方法,于是它就调用此方法。

而Cricle.prototype.area就永远也不会被调用。PI的调用也是如此。那么子类如何想调用父类的方法应怎么办呢?好像没有什么办法哦,谁知道可以告诉我。但面向对象的理论告诉我们,继承主要是提供接口而不是代码复用,所以还是少有这样的念头为好 :)。

下面是一个例子程序。包含上面的所有的概念。
例子
///////////define: Cricle//////////////////
function Circle(r) {
this.r = r;
}
Circle.PI = 3.14;
Circle.prototype.PI = 3.14;
Circle.prototype.area = function() { return Circle.PI*this.r*this.r; }
Circle.prototype.area2 = function() { return this.PI*this.r*this.r; }


//// test
c = new Circle(3);
//alert("area1 :"+c.area());
//alert("area2 :"+c.area2());

Circle.max = function(a, b) { return a.r>b.r ? a.r : b.r; }
//alert("max is "+Circle.max(new Circle(1), new Circle(3)));

c1 = new Circle(1);
c2 = new Circle(1);
c2.PI = 100;//Circle.prototype.PI=100;

//alert("c1.area1 "+c1.area());
//alert("c1.area2 "+c1.area2());
//alert("c2.area1 "+c2.area());
//alert("c2.area2 "+c2.area2());

////////////////////////define: SubCircle //////////////////
function SubCircle(x, y, r) {
this.x = x;
this.y = y;
this.r = r;
}
SubCircle.prototype = new Circle(0);
SubCircle.prototype.PI = 100;
SubCircle.prototype.move2 = function(x, y) { this.x = x; this.y = y;}
SubCircle.prototype.area = function() { return this.PI*this.r*this.r*this.r; }

//// test
sc = new SubCircle(0,0,2);

alert(sc.area());

分享到:
评论

相关推荐

    javascript面向对象编程参考资料

    下面将详细探讨JavaScript面向对象编程的核心概念、特性以及实际应用。 1. **对象与数据封装** 在JavaScript中,对象是键值对的集合,可以看作是属性和方法的容器。通过创建对象,我们可以封装数据和相关操作,...

    JavaScript面向对象编程指南(第2版)

    1.本书是唯一一本介绍JavaScript面向对象编程的图书。, 2.本书作者是知名的Web开发人员和作者。受到国内众多前端开发人员,如淘宝UED团队的推崇和推荐。 Stoyan Stefanov:Facebook公司工程师、作家、演说家。他经常...

    复习JavaScript面向对象技术

    JavaScript是一种广泛应用于Web开发的脚本语言,尤其在构建交互式网页和动态应用程序...通过阅读《JavaScript面向对象技术整理.docx》和参考《javascript中文经典帮助手册.chm》,你可以更深入地学习和掌握这些知识点。

    JavaScript面向对象编程指南

    JavaScript是一种广泛应用于Web开发的动态脚本语言,其面向对象编程是其核心特性之一。面向对象编程(Object-Oriented Programming, OOP)是一种编程范式,它基于“对象”概念,通过封装、继承和多态等机制来设计和...

    javascript对象参考手册

    最后,手册可能还会涉及面向对象编程的概念,如封装、继承和多态,以及JavaScript中的类和模块系统。这将帮助开发者构建更结构化、可维护的代码。 总的来说,"JavaScript对象参考手册"是一本全面的资源,无论你是...

    面向对象Javascript核心支持代码分享

    JQury框架绝对是页面开发的首选,代码短小强悍,缺点就是... Javascript做面向对象开发的时候,总是会用到很多模拟面向对象特性的方法,这些方法就构成了支撑面向对象Javascript的核心代码,以下就是部分代码,其中参考

    《JavaScript内核系列》和《JavaScript面向对象基础》

    《JavaScript内核系列》和《JavaScript面向对象基础》这两本书籍是深入理解JavaScript语言核心机制和面向对象编程的重要参考资料。JavaScript作为一种广泛应用于Web开发的脚本语言,其内核和面向对象特性对于开发者...

    javascript面向对象三大特征之多态实例详解

    本文实例讲述了javascript面向对象三大特征之多态。分享给大家供大家参考,具体如下: 多态 从某种意义上来说,多态是面向对象中重要的一部分,也是实施继承的主要目的。 一个实例可以拥有多个类型,它既可以是这种...

    面向对象分析设计参考案例-网上书店系统WebLab

    ### 面向对象分析设计参考案例:网上书店系统WebLab #### 一、面向对象的概念及重要性 面向对象编程(Object-Oriented Programming,简称OOP)是一种软件开发方法,它通过“对象”这一基本单位来组织代码。对象是...

    javascript面向对象三大特征之封装实例详解

    本文实例讲述了javascript面向对象三大特征之封装。分享给大家供大家参考,具体如下:封装封装(Encapsulation):就是把对象内部数据和操作细节进行隐藏。很多面向对象语言都支持封装特性,提供关键字如private来隐藏...

    Javascript 高级程序设计(第3版)超清中文PDF

    JavaScript的面向对象特性是其区别于其他脚本语言的一个显著特点。书中详细阐述了基于原型的继承、构造函数、对象字面量等面向对象编程模式,以及如何使用类和模块来组织代码,提高代码复用性和可维护性。同时,还...

    javascript面向对象之对象的深入理解

    这些内容提供了对JavaScript面向对象编程的一个初步认识,重点在于理解JavaScript中对象的含义和特性。通过实例分析和代码运行结果,本文帮助读者认识到在JavaScript中,对象无处不在,从创建自定义对象到理解...

    即用即查JavaScript核心对象参考手册光盘

    此外,JavaScript还有原型链和原型继承的概念,这是其面向对象特性的重要组成部分。每个对象都有一个proto(或__proto__)属性,指向创建它的构造函数的prototype对象。通过这种方式,对象可以继承其他对象的属性和...

    Javascript参考手册中文版chm版

    JavaScript还支持原型继承和类的概念,这使得它可以实现面向对象编程。手册会讲解如何创建对象、原型链的工作原理以及构造函数的使用。 此外,JavaScript还包含错误处理、事件处理、DOM操作、AJAX异步通信、Promise...

    javascript参考手册

    同时,还包括了作用域、闭包、原型链和面向对象编程的概念。 2. **微软JavaScript手册js**: 微软的手册可能特别强调JavaScript在Web开发中的应用,特别是与HTML和CSS的交互。它可能包含了DOM操作、事件处理、AJAX...

    书:《即查即用JavaScript核心对象参考手册》源码

    此外,书中还会涉及JavaScript的原型和原型链,这是其面向对象特性的基础。通过原型,对象可以继承其他对象的属性和方法,实现代码的复用。构造函数和`new`关键字的应用也是这部分的重要内容。 事件处理和DOM操作也...

    javascript绝佳参考资料

    4. **面向对象编程**:讲解JavaScript中的构造函数、原型、继承等面向对象特性,以及如何创建和使用自定义对象。 5. **闭包和作用域**:解释JavaScript中的作用域规则和闭包的概念,这对于理解函数如何访问和保存...

    JavaScript语言中文参考手册.zip

    4. **面向对象编程**:虽然JavaScript不是一种严格的面向对象语言,但它支持面向对象编程风格,如类、继承和封装。手册将详细介绍如何实现这些概念,包括使用函数作为构造函数、原型链实现继承以及使用`class`关键字...

Global site tag (gtag.js) - Google Analytics