实际上,面向对象的思想是独立于编程语言的。比如在C#中,在一个静态类的静态方法中,按照过程化开发调用一系列静态函数,所以我们很难说这是面向对象的编程。相反,像jquery和extjs这样优秀的javascript库处处体现了面向对象的设计思想。本文不打算讨论javascript是否可以视为面向对象的编程语言,重视语文考试的人应该注意。我将简单解释如何在javascript中使用面向对象的编程思想。面向对象首先必须有一个对象。用javascript创建对象非常简单:复制代码如下: var o={ };这样就创建了一个对象,我们可以很容易地给这个对象添加属性和方法:复制代码如下: o.name=' object nameo . show name=function(){ alert(o . name);}但是大多数人还是习惯把对象的属性和方法放在一对定义对象的{}中:复制代码如下: var O={ NAME : ' OBJECT NAME ',SHOWNAME 3360 function(){ ALERT(O . NAME);}}访问属性和方法有两种方式。第一种方式是复制代码如下: alert(o . name);o . show name();这种写法很常见,也是C#中调用对象的属性和方法的方式。javascript中还有一个特殊的,使用属性或方法的名称作为索引进行访问:复制代码如下: alert(o[' name ']);o[' show name ']();这似乎和孔乙己的“写茴香有几种方法”类似。事实上,很少有人使用索引来调用对象的属性或方法。除了我们的自定义属性和方法,我们的对象还有一个构造器属性和方法,比如toString()。这些属性和方法来自对象的内置对象,所有对象都会有这些属性和方法。其中构造函数属性指向构造对象的构造函数。我们不使用构造函数来创建对象。事实上,js解释器使用对象构造器。如果我们定义自己的构造函数,就可以用这个构造函数来创建对象,可以让创建的对象有相同的属性和方法,开始有点面向对象的味道。好了,让我们从一个简单的例子开始,看看如何创建一个构造函数:复制如下代码:函数人(姓名,性别,年龄){this。name=namethis.sex=sexthis.age=年龄;this . ShowInfo=function(){ alert(' name:' this . name '性别:' this.sex '年龄:' this . age);}}我们定义了一个名为Person的构造函数,它有三个属性和一个方法。生成一个对象,通过构造函数调用方法也很简单:复制代码如下: var张三=new Person('张三','男',18);Zhang San . showinfo();运行后,我们可以看到一个弹出的对话框,显示了这个叫张三的人的信息:。
我们也可以看看对象的构造函数属性,看看张的构造函数是不是我们定义的Person:的副本代码。代码如下:报警(张。建造师);结果如下:
如您所见,它是我们的人员构造器。然而,这里仍然存在一个问题。每次构造一个对象,我们都会在内存中为属性和方法分配内存空间。其实所有的对象完全可以使用同一个方法,不需要有多个方法的副本,浪费了一些内存空间。既然我们意识到了这个问题,我们就来思考一下如何解决它。一个自然的想法是,由于我们只想为一个方法分配一次内存空间,所以我们可以设置一个值来标识该方法的内存空间是否已经分配。按照这个思路,我们对构造器进行如下修改:复制代码如下:函数人(姓名、性别、年龄){this。name=namethis.sex=sexthis.age=年龄;If(人的类型。_ initialized==' undefined '){ this。show info=function(){ alert(' name:' this . name ' gender:' this . sex ' age:' this . age ');}人。_ initialized=true}}这里,我们使用一个member _initialized来指示方法是否已经分配了内存空间。当构造第一个对象时,_initialized是未定义的,所以我们的判断语句是真的。此时,定义方法并分配内存空间,然后将_initialized的值设置为true,以指示方法的内存空间已分配。当构造第二个对象时,它不会再次进入判断,因此不会再次分配内存空间。似乎没有问题。运行一下,看张三的信息还是显示正常。虽然不难,但解决了一个小问题。让我们庆祝一下。我想吃一道川菜猪肉。吃饭前,一个叫李四的MM还想让她的个人信息在电脑上弹出来。好的,很简单,只需要构造一个对象,调用showInfo方法:复制代码如下: var lisi=new Person ('Li Si ','女',28);Lisi . ShowInfo();为了照顾MM,我也把这一段放在张三面前。MM的信息显示正确,但是张三的信息缺失。我对接下来的三张照片不满意。把排名放在MM后面没关系,但至少要有名字。这对作为程序员的我来说很难。好像吃不下川式猪肉。让我们先改变错误。打开firebug,看到MM的信息后出现错误,提示是:张山。显示信息不是一个功能。看断点。构造张思对象后,发现没有showInfo方法。原来,虽然只有一个showInfo方法,但它存在于第一个对象中,第二个对象无法访问。那么,同一个构造函数产生的对象如何共享同一个函数呢?javascript中的Prototype为我们提供了这个功能。根据javascript的规范,每个构造函数都有一个原型属性用于继承和属性共享。我们的showInfo方法也可以被视为指向函数引用的属性。现在我们使用原型使我们的方法可以共享。代码更改很简单。只需将此. showInfo改为Person.prototype.showInfo,更改后的代码如下:复制代码如下:函数Person(姓名、性别、年龄){this。name=namethis.sex=sexthis.age=年龄;If(人的类型。_ initialized==' undefined '){ person . prototype . show info=function(){ alert(' name:' this . name ' gender:' this . sex ' age:' this . age ');}人。_ initialized=true}}使用此构造函数生成两个对象:复制代码如下: var lisi=new Person ('Li si ','女',28);Lisi . ShowInfo();Var张三=新人('张三','男',18);Zhang San . showinfo();操作完成后,先显示李四的信息,然后显示张三的信息。现在两个人都满意了,可惜我的川式猪肉已经凉了。