面向对象的编程思想在javascript中的运用上部_js面向对象

其实,面向对象的思想是独立于编程语言的,例如在C#中,在一个静态类的静态方法中,按照过程式开发调用一系列静态函数,我们很难说这是面向对象的编程,相反,象jquery和extjs这样优秀的javascript库,却处处体现着面向对象的设计思想。本文不打算探讨javascript是否能够算做面向对象的编程语言,这个问题是重视中国式考试的人应该关注的,我这里只是简单的说明如何在javascript中使用面向对象的编程思想。
面向对象首先要有对象。在javascript中创建一个对象非常简单:

复制代码 代码如下:

var o={};

这样就产生了一个对象,我们可以很方便的给这个对象添加属性和方法:

复制代码 代码如下:

o.name="object name";
o.showName=function(){
alert(o.name);
}

不过大多数人还是习惯把对象的属性和方法放在定义对象的一对{}里边:

复制代码 代码如下:

var o = {
name: "object name",
showName: function() {
alert(o.name);
}
}

访问属性和方法有两种方式,第一种:

复制代码 代码如下:

alert(o.name);
o.showName();

这种写法很常见,C#中调用对象的属性和方法也是这种方式。还有一种是javascript中比较特别的,使用属性或者方法的名字作为索引来进行访问:

复制代码 代码如下:

alert(o["name"]);
o["showName"]();

这好像有点和孔乙己“茴香的茴字有几种写法”差不多了,事实上,很少有人使用索引来调用对象的属性或者方法。
除了我们自定义的属性和方法,我们的对象还有一个constructor属性以及toString()等方法。这些属性和方法是从Object内置对象来的,所有的对象都会有这些属性和方法。其中constructor属性指向构造出该对象的构造函数。我们没有使用构造函数来创建对象,事实上,js的解释器会使用Object构造函数。如果我们自己定义了构造函数,那么便可以通过该构造函数来创建对象,这样可以使得创建的对象具有相同的属性和方法,这便开始有点面向对象的味道了。好,我们从一个简单的例子开始看看如何创建一个构造函数吧:

复制代码 代码如下:

function Person(name, sex, age) {
this.name = name;
this.sex = sex;
this.age = age;
this.showInfo = function() {
alert("姓名:" + this.name + " 性别:" + this.sex + " 年龄:" + this.age);
}
}

我们定义了一个名字叫Person的构造函数,该构造函数有三个属性和一个方法,通过构造函数来产生一个对象并调用方法也非常简单:

复制代码 代码如下:

var zhangsan = new Person("张三", "男", 18);
zhangsan.showInfo();

运行后我们可以看到弹出一个对话框,显示出这个叫张三的人的信息:

我们还可以看看对象的constructor属性来看看zhangsan的构造函数是不是我们定义好的Person:

复制代码 代码如下:

alert(zhangsan.constructor);

结果如图:

可以看到,正是我们的Person构造函数。
不过,这里还是有点问题,每一次我们构造一个对象,都会在内存中为属性和方法分配内存空间,而事实上,所有的对象完全可以用同一个方法,并不需要有多个方法的副本,这样有些浪费内存空间。既然意识到了这个问题,让我们来想想如何解决吧。一个很自然的想法是,既然我们只想为方法分配一次内存空间,那么我们可以设置一个值用来标识方法的内存空间是否已经分配,按照这个思路,我们将构造函数做如下修改:

复制代码 代码如下:

function Person(name, sex, age) {
this.name = name;
this.sex = sex;
this.age = age;
if (typeof Person._initialized == "undefined") {
this.showInfo = function() {
alert("姓名:" + this.name + " 性别:" + this.sex + " 年龄:" + this.age);
}
Person._initialized = true;
}
}

这里,我们用一个成员_initialized来指示是否已经对方法进行了内存空间的分配。当第一个对象构造的时候_initialized未被定义,所以我们的判断语句为真,这时会对方法进行了定义并分配内存空间,然后把_initialized的值设置为true,用以表明方法的内存空间已经分配了。第二个对象构造的时候则不会再进入判断,因而也不会再一次分配内存空间。似乎没什么问题,运行一下看看,张三的信息依然正常显示。虽然不辛苦,不过解决了一个小问题,还是庆祝下吧,来盘回锅肉,我要大快朵颐。还没开吃,一个叫李四的MM也想让电脑弹出她的个人信息。OK,很简单,再构造一个对象,然后调用showInfo方法就可以了:

复制代码 代码如下:

var lisi = new Person("李四", "女", 28);
lisi.showInfo();

为了照顾MM,还把这段放在了张三的前边。MM的信息正确显示出来了,可是张三的资料不见了。这下张三不乐意了,排名放在MM后边也罢了,但好歹得有名字啊。这可苦了我这编程人员,回锅肉看来没办法吃了,先改bug吧。打开firebug,看到MM的信息显示之后出现错误,提示为:zhangsan.showInfo is not a function。设置断点看看,构造zhangsi对象以后发现并没有showInfo这个方法。原来showInfo方法虽然只有一个,但是存在于第一个对象之中,第二个对象并不能访问。那么,究竟如何才能让同一个构造函数产生的对象共用同一个函数呢?javascript中的prototype给我们提供了这个功能。根据javascript的规范中描述,每一个构造函数都有一个prototype属性用于实现继承和属性的共享。我们的showInfo方法也可以看作是一个属性,该属性指向一个函数的引用。现在我们使用prototype来使得我们的方法可以共享,代码的改动很简单,把this.showInfo改成Person.prototype.showInfo就可以了,改动之后的代码如下:

复制代码 代码如下:

function Person(name, sex, age) {
this.name = name;
this.sex = sex;
this.age = age;
if (typeof Person._initialized == "undefined") {
Person.prototype.showInfo = function() {
alert("姓名:" + this.name + " 性别:" + this.sex + " 年龄:" + this.age);
}
Person._initialized = true;
}
}

使用该构造函数生成两个对象:

复制代码 代码如下:

var lisi = new Person("李四", "女", 28);
lisi.showInfo();
var zhangsan = new Person("张三", "男", 18);
zhangsan.showInfo();

运行之后先显示李四的信息,然后是张三的信息。现在两个人都满意了,可惜我的回锅肉已经凉了

时间: 2024-08-03 01:39:03

面向对象的编程思想在javascript中的运用上部_js面向对象的相关文章

在ASP.NET中面向对象的编程思想

asp.net|编程|对象 首先,我们还是来谈一下面向对象的编程思想吧.我想现在的主流编程思想无非两种:结构与面向对象.以前,在ASP中我们完全采用的是结构化思想.现在,asp.net可以完全支持面向对象的编程思想,这不得不说是一个质上的飞跃. 记得我在大约半年前给大家写过一篇<<面向对象从人造地球谈起>>,当时是由于看到一本小说的启发,发现任何东西都可以用面向对象的思想来看.我现在还是简单谈一下吧,面向对象无非就是把世间万物当做一个类,要想使用类做事,就必须创建类的实例.这很好理

Javascript基础与面向对象基础~第四讲 Javascript中的类对象

今天来说JS中如何实现类(class),事实上本应该昨天晚上写的,可我失言了,在些说一声"抱歉"!JS中的类是JS面向对象的基础,也是我最拿手的东西,你写的代码能否提高一个层次,一般是从这点上看出来的. 占占对类的定义: 类是对现实中的事物的抽象,一个类一般由属性和方法构成,属性是一些固定的信息,而方法是类的某种行为,类往往用来抽象一些复杂的对象,类与类这间可以进行继承,一般通过JS的function实现,JS中的类对象是实现JS面向对象的基础. 占占对结构体的定义: 一个结构体也是对

《C++面向对象高效编程(第2版)》——1.9 面向对象软件开发的阶段

1.9 面向对象软件开发的阶段 C++面向对象高效编程(第2版) 1.9.1 面向对象分析(OOA) 很显然,软件工程不是从研究一组类或对象开始的.我们从简单描述问题开始(大多数都不完整),这是面向对象软件开发过程的起点.在这一阶段中,我们要找到合适的类.记住,为了提供良好的解决方案,大多数复杂的问题需要的不只是一个类,而是许多类.一组类可以互相通信.合作和协作,以完成最终的目标.问题是我们如何找到(甚至创造)所需的类?这可能是面向对象软件开发过程中最困难的一步,这一过程占据了相当长的时间.由于

《C++面向对象高效编程(第2版)》——2.22 面向对象设计的表示法

2.22 面向对象设计的表示法 C++面向对象高效编程(第2版)正如我们需要语言来表达我们的思想,面向对象设计也需要词汇(或表示法)来传达问题解决方案的思路.我们需要一种表示法可以代表类.对象.类关系.状态图.进程图.对象关系等. 最初,在我开始写这本书时,有两种流行的对象表示法:Booch表示法(由Grady Booch of Rationsl制订)和OMT(对象建模技术,James Rumbaugh和他的团队在通用电气公司制订).我喜欢用Booch表示法.然而,1994年Rumbaugh与B

JavaScript 类的定义和引用 JavaScript高级培训 自定义对象_js面向对象

一,概述 在Java语言中,我们可以定义自己的类,并根据这些类创建对象来使用,在Javascript中,我们也可以定义自己的类,例如定义User类.Hashtable类等等. 目前在Javascript中,已经存在一些标准的类,例如Date.Array.RegExp.String.Math.Number等等,这为我们编程提供了许多方便.但对于复杂的客户端程序而言,这些还远远不够. 与Java不同,Java2提供给我们的标准类很多,基本上满足了我们的编程需求,但是Javascript提供的标准类很

《C++面向对象高效编程(第2版)》——1.13 面向对象编程语言的要求

1.13 面向对象编程语言的要求 C++面向对象高效编程(第2版)现在,可以从支持面向对象编程的角度来研究编程语言了.什么语言可以成为面向对象编程语言? 任何声称支持面向对象编程的语言都必须提供易于设计和实现的特性: 数据抽象 封装 继承 所谓"易于",指的是抽象和封装必须自然而然,不需要程序员在这上面花太多功夫.程序员通过语言的要素,应该很容易地实现优秀的抽象和提供数据封装.必须牢记,这些语言是设计用于支持OOP的. 表 1-2 对于OOP,继承是另一项非常重要的特性.不支持继承的语

JavaScript 原型与继承说明_js面向对象

function A(x) { this.x = x; } alert(A.prototype); alert(A.prototype.constructor); 根据弹出的结果,我们可以得到:原型对象是由函数的构造函数创建,它所拥有的属性能被所有对象共享,初始时原型对象指向一个Object对象,并且定义了一个constructor属性,该属性指向定义该原型对象的构造函数本身,再看如下代码. Code function A(x) { A.prototype.x = x; } var obj =

连载:面向对象葵花宝典:思想、技巧与实践(5) - 面向对象迷思:面向对象导致性能下降?

面向对象会导致性能降低? 这是一个在IT江湖流传已久的传说,很多对面向对象不甚了解.或者一知半解的人,每当需要抵触面向对象时,就会把这条"金科玉律"拿出来救驾!   更要命的是,每个相信这个传说的人都会举一个看起来很显而易见的例子:C和Java的对比!   你可以到网上搜索一大堆C和Java的性能对比,你自己也可以做一个简单的对比测试,我毫不怀疑测试结果肯定是C快,但这能证明面向对象导致性能降低么?   从语言层面来说,面向对象的语言肯定要比面向过程的语言性能要低一些,毕竟这是由处理机

javascript 对象入门实例教程_js面向对象

1:构造函数法 [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行] 注解: 1:这里定义了一个Dog对象(在javascript中,函数就是对象,这里function Dog(name,weight) 同时也是构造函数),用new关键字创建了一个对象实例dog. 2:其中_name._weight._show._sex为实例dog的属性.可以通过:实例名.属性名 或 实例名["属性名"]访问实例属性,即dog._name=dog["_name"]. 3:在构