在基于对象的编程中,用对象给真实的事物建模,而对象通过其方法和属性来定义。
每个JavaScript对象都有一组相关属性和方法,可用于操作某种数据。例如,Array对象包含可以操作数组的方法,以及可 以检索数组信息的属性。要使用这些方法和属性,需要把数据定义为这些对象中的一个,也即需要创建对象。
在JavaScript中对象数据在变量中的存储方式与基本数据类型(例如文本和数字)不同。基本数据类型是JavaScript中最基本的数据。对于基本数据类型,变量存储数据的实际值。例如:number变量存储了数据23
var number=23;
而赋予对象的变量不存储实际数据,而存储指向保存数据的内存地址的引用。变量引用一个对象时,其含义是变量引用一个内存地址。例如:定义了一个数组对象,并声明一个变量array指向该对象的内存地址的引用
var array=[0,1,2];
创建对象
JavaScript创建对象的方式与其他编程语言很类似,要创建各种类型的对象,可使用new运算符或者字面量符号法。
要创建JavaScript对象,只需要使用new操作符后接Object构造函数即可:
var object=new Object();
var date=new Date();
var string=new String("hello");
JavaScript提供了一个字面量语法来表示对象:一对花括号({ }):
var object={};
创建自定义对象
JavaScript内置了很多功能强大的内置对象,例如Array对象,Date对象,String对象等等。但JavaScript的真正强大之处在于用户可以创建自己的对象来表示复杂的数据。
创建自定义对象首先需要创建一个Object对象,有上面两种创建对象的方法。例如:声明一个person变量来引用自定义对象。
var person=new Object();
var person={};
创建对象后,就可以给对象添加一些属性。这类似于变量的创建,只是不再使用var关键字。仅使用对象的名称,后跟一个句号以及属性的名称,之后,再给该对象赋予值。例如:
person.name="Jason";
person.age=18;
上面两行代码为person对象创建了name和age属性,并分别为它们赋予了值。JavaScript并不会检查这些属性在之前是否就已存在,它只负责创建它们。
person对象中方法定义如下,下面的代码为方法赋值,只是所赋的是一个函数而不是其他类型的值。注意方法内部this的用法,this.name和this.age。在JavaScript中,this是一个指向当前对象的特殊变量。从字面上来讲,它表示“这个对象”。
person.getMsg=function () {
document.write("My name is "+this.name+".And age is "+this.age+"<br/> ");
};
注意在function和()之间没有名称。没有名称的函数称为匿名函数。将匿名函数赋给变量后,该函数的名称就为变量的名称。因此可以执行赋给person.getMsg的匿名函数,如下所示:
person.getMsg();
创建person对象的完整代码如下:
var person={};
person.name="Jason";
person.age=18;
person.getMsg=function () {
document.write("My name is "+this.name+".And age is "+this.age+"<br/> ");
};
使用字面量符号法(literal notation)来定义整个对象,可以将这4条语句缩减为一条语句。
var person={
name:"Jason",
age:18,
getMsg:function () {
document.write("My name is "+this.name+".And age is "+this.age+"<br/> ");
}
};
注意字面量符号法使用花括号将整个对象置于其中。然后采用属性名称/方法名称后跟一个冒号和值的方式定义了每个属性和方法。在此没有使用等号,在对象的字面量符号法中,是采用冒号来设置属性的值。最后注意用逗号隔开每个属性和方法的定义。
创建对象的新类型(引用类型)
JavaScript提供了大量内置于该语言的对象,供我们使用。也可以创建自定义的对象来表示更复杂的数据,不过JavaScript也支持用户创建自己的对象类型。例如,可以创建表示个人的object对象,但也可以创建表示Person对象的对象。
在上面定义的person变量引用的是一个简单的自定义object对象,仅能创建包含自定义属性和方法的简单对象,并没有创建实际的Person对象。
JavaScript允许根据自己的需求创建特定对象的模板。JavaScript支持引用类型的定义,引用类型实际上是对象的模板。在使用新的对象类型之前,需要先定义对象类型及其方法和属性。一个重要的区别是,在定义引用类型时,不会创建基于该类型的对象。只有使用new关键字创建该引用类型的实例时,才会根据原型(prototype)创建该类型的对象。在Java中,引用类型相当于类,但在JavaScript并不支持正式的类结构,该语言完全支持对应的逻辑,即引用类型。JavaScript内置对象都是引用类型,String,Array,Number,Date和Object都是引用类型,用户创建的对象是这些类型的实例。
引用类型由以下三部分组成:
前面创建了表示单个人的对象,下面创建一个简单的引用Person,它的作用和前面创建的对象一样,只是这些对象是实际的Person对象。
首先需要创建构造函数,在构造函数中创建了两个属性并分别进行赋值初始化,如下所示:
function Person(firstName,lastName) {
this.firstName=firstName;
this.lastName=lastName;
}
在构造函数中定义的firstName和lastName属性称作实例数据,实例数据对于每个对象或实例都是唯一的。在所有的对象之间不应该共享它们。
然后定义方法,可以在构造函数中定义,也可以在Person的prototype来定义它们则更高效:
Person.prototype.getFullName=function () {
return this.firstName+" "+this.lastName;
};
Person.prototype.greet=function (person) {
document.write("Hello, "+person.getFullName()+" .I'm "+this.getFullName()+"<br/>");
};
注意Person.prototype,在JavaScript中函数也是对象,所以函数也包含属性和方法。每个函数对象都包含prototype属性,但该属性仅对构造函数有用。可以将Person.prototype属性看成Person对象的实际原型。赋给Person.prototype的任何属性和方法对于Person对象都可用。所有Person的对象或实例都可以共享赋给Person.prototype.getFullName和Person.prototype.greet的函数,这意味着一个Person对象的getFullName的函数对象与另一个Person对象的getFullName的函数对象是完全一样的,可以使用如下代码来表示:
var isSame=person1.getFullName==person2.getFullName;//true
完整地自定义引用类型代码:
function Person(firstName,lastName) {
this.firstName=firstName;
this.lastName=lastName;
}
Person.prototype.getFullName=function () {
return this.firstName+" "+this.lastName;
};
Person.prototype.greet=function (person) {
document.write("Hello, "+person.getFullName()+" .I'm "+this.getFullName()+"<br/>");
};
定义完引用类型后就可以创建使用了,创建引用类型的实例与创建JavaScript内置类型的实例一样:使用new关键字。
var johnDoe=new Person("John","Doe");
var janeDoe=new Person("Jane","Doe");
建议定义引用类型来替代自定义的对象,主要区别在于对象的创建方式。与字面量对象相比,构造函数中的对象通常消耗的计算机内存要少一些。