在javascript里有几种创建对象的方法,在不同的场合可用不同的方法.最简单的就是用new操作符,例如:
复制代码 代码如下:
我们在这个例子里定义了person这个对象,然后加入了它的属性和方法.在这个例子里,自定义的方法里有两个属性.
用文字记号LiteralNotation创建对象
用文字记号也可以创建对象,但要javascript1.2以上版本.它的创建形式是多样的.
复制代码 代码如下:
文字记号可是是数组,也可以是任意的javascript表达式或值.
用new操作符或文字记号创建一个自定义对象都是简单的,也是符合逻辑的.但它最大的缺点就是结果不可复用.也不能很容易的用不同的版本初始化创建对象.例如上面的第一个例子,如果person的name不是"TimScarfe",那样我们不得不重新定义整个对象,仅仅为了适应它的一点点改变.
对象的构造和原型
在OOP的世界里,用先前的方法定义对象在许多场合都有限制.我们需要一种创建对象的方法,类型可以被多次使用而不用重新定义.对象在实例化时每次都可以按需分配不同的值.实现这个目标的标准方法是用对象构造器函数.
一个对象构造器只不过是个有规则的javascript函数,它就象一个容器(定义参数,调用其他函数等等).它们两者所不同的是构造器函数是由new操作符调用的.(你将在下面的例子中看到).基于函数语法形式的对象定义,我们可以使它工作得最好.
让我们用现实世界中的猫来举个例子.猫的name和color是猫的属性.meeyow(猫叫)是它的一个方法.重要的是任何不同的猫都可能有不同的name和meeyow的叫声.为了建立适应这些特征的对象类,我们将使用对象构造器.
复制代码 代码如下:
在这里,函数cat()是一个对象构造器,它的属性和方法在函数体里用this来定义,用对象构造器定义的对象用new来实例化.主意我们如何非常容易的定义多个cat的实例.每一个都有自己的名字,这就是对象构造器带给我们的灵活性.
构造器建立了对象的蓝图.并不是对象本身.
在原型里增加方法.
在上面我们看到的例子里,对象的方法是在构造器里定义好的了.另外一种实现的途径是通过原型(prototype).xxx
原型是javascript继承的一种形式.我们可以为对象定义好后,再创造一个方法.原来所有对象的实例都将共享.
让我们来扩展最初的cat对象.增加一个改名的方法.用prototype的方式.
复制代码 代码如下:
就象你所看到的.我们仅只用了关键字prototype实现了在对象定义后马上增加了changeName方法.这个方法被所有的实例共享.
用原型(prototype)重载javascript对象
原型在自定义对象和有选择性的重载对象上都可以工作.比如Date()或String这可能是无止境的.
子类和超类
在JAVA和C++里,有关于类层次的外在概念.每一个类能有一个角色.
InJavaandC++,thereisanexplicitconceptoftheclasshierarchy.i.e.Everyclasscanhaveasuperclassfromwhichitinheritspropertiesandmethods.Anyclasscanbeextended,orsub-classedsotheresultingsubclasscaninherititsparent'sbehavior.Aswehaveseen,javascriptsupportsprototypeinheritanceinsteadofclassbased.It'spossibleforinheritancetohappenotherways,however.
Thefollowingisanexampleofinheritancethroughfunctions.
下面一个例子演示了如何继承通过function.
复制代码 代码如下:
基于继承的原型是遥远的.为javascript应用程序在许多场合.
(基于原型的继承在许多javascript的应用场合是非常有用的.)
对象作为联合数组
正如你所知,(.)操作符能够用来存储.[]操作符用来操作数组.
HowdoIloopthroughpropertiesinanobject?
Youneedtouseafor/inloop.
我们可以通过forin循环来遍历对象的属性。
Theimportantthingtonoticeisthatintheobjectsyntaxthepropertyisanidentifier,whereasinthearraysyntax,it'sastring.Theobviousbenefitsofusinganarraysyntaxtoaccessanobjectisbecauseoftheliteraldatatype,youcaneasilyconcatstringsandplayaroundwiththemtoaccessanobject.Forthistoworkwiththestandardsyntax,aneval()wouldneedtobeused.
应该值得注意的是对象的属性只是一个标识字符,尽管在一个数组里是一个字符串,因为是一个literal的数据类型,所以有利于使用数组的方式的操作一个对象。你也可以很容易的存取一个对象在标准的语句中。这个时候eval()函数可能用得到。
网上的东西错误的太多了,jb51.net修正后的测试下
[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]