对象是对具有某些特性的具体事物的抽象。编程语言中的对象实际上是对现实世界中对象的抽象和模拟。JavaScript支持对象,其它如C++,Java等高级编程语言都有很强的对象表达和处理能力。在编程世界中,数据和处理数据的方法结合在一起就构成了对象。
JavaScript是一种基于对象(Object-based)的编程语言,其本质是面向对象。在JavaScript中没有类的概念,而是基于原型拷贝(称为原型对象)。
通过函数创建对象
最简单的创建对象的方法是通过函数来创建对象,此时函数称为类模板,它相当于高级编程语言中的类的作用。在定义函数之后,可以使用new
关键字和函数名一起创建新的对象,并把它赋值给一个变量,这时定义的函数实际上就是一个构造函数。在定义函数时,使用this
关键字来代表将来所创建的对象。下面是一个例子:
function Person(name,age){ this.name = name; //定义一个Person的属性为name this.age = age; //定义一个Person的属性为age this.address = "上海"; } //通过函数创建一个对象 var p1 = new Person("张三",20); alert(p1.name); // 输出名字为:张三 //创建第二个对象 var p2 = new Person("李四",22); p2.address = "广州"; //修改p2对象的address属性 alert(p2.address); //输出:广州
在函数内部通过var
关键字定义的属性是私有属性,属于局部变量,而不是类的属性。这个属性不能被对象所使用。
function Person(name,age){ this.name = name; //定义一个Person的属性为name this.age = age; //定义一个Person的属性为age var address = "上海"; //私有属性 } var p1 = new Person("张三",20); alert(p1.address); //undefined
我们知道,在类中除了有类的属性之外,还应该有类的方法。如何在类模板中创建类的方法呢?如果要创建共有的方法,可以通过this.fn = function(){}
的方式来创建,如果要创建私有的方法,可以通过function fn2(){}
的方式来创建。例如:
function Person(name,age){ this.name = name; //定义一个Person的属性为name this.age = age; //定义一个Person的属性为age this.say = function(){ //创建一个公共的类方法 alert("大家好!"); }; function dosomething(){ //创建一个私有的方法 alert("ok"); } } var p1 = new Person("张三",20); alert(p1.name+" 说 "+p1.say()); //输出:张三 说 大家好
使用函数来创建对象的缺点是:当通过类模板来创建了多个对象实例的时候,内存中会存在多个对象属性和方法的拷贝。也就是说,通过Person类创建了对象p1,内存中会有p1对象的name、age属性和say()方法,如果再创建一个对象p2,又会有p2对象的name、age属性和say()方法,创建100个属性就会有100份这样的拷贝,非常占用内存(在高级编程语言中,对象的属性和方法指向的是同一份拷贝)。在后面我们会讲到通过原型链的方式来解决这个问题。
通过new()运算符和Object()构造函数来创建对象
我们还可以通过new()
运算符来创建对象实例。要创建一个对象,只需要使用new
运算符,然后跟上要创建对象的构造函数即可。例如,常用的构造函数包括Object()
、Array()
、Date()
等等。这些构造函数都是JavaScript的内置函数。new()
运算符返回所创建对象的引用,程序应该把这个引用赋值给某个变量,并通过变量来访问所创建的对象。下面是使用构造函数创建对象的一些例子:
var cat = new Object(); var arr = new Array("a1","a2","a3");
构造函数是一种特殊的函数,它具备了创建对象并初始化对象的功能,正是由于这种构造对象的特性,才把这种类型的特殊函数称为构造函数。JavaScript提供了一个构造空对象的特殊构造函数Object(),可以用它来构造一个空的对象,并通过扩展这个对象来构造需要的对象。使用Object()
创建对象时,需要把new
运算符的返回值赋值给某个变量,并通过该变量来引用创建的对象。注意,指定给对象的属性隶属于对象,并且不能使用var
关键字来声明。使用Object()
构造函数来创建对象的一般格式为:
var obj = new Object();
例如构建一个对象的过程为:
var person = new Object(); person.name = "张三"; person.age = 20;
对象的常用操作
我们除了使用对象.属性名称的方法来调用对象的属性之外,还可以使用对象["属性名称"]的方法来调用属性。例如:
function Person(name,age){ this.name = name; //定义一个Person的属性为name this.age = age; //定义一个Person的属性为age this.say = function(){ //创建一个公共的类方法 alert("大家好!"); }; } var p1 = new Person("张三",20); alert(p1.name); //对象.属性名称 alert(p1["age"]); //对象["属性名称"]
我们可以使用for(var 属性 in 对象)
的方式来循环获取对象的所有显示声明的属性:
...... for(var a in p1){ alert(a); //循环获取所有a对象显示声明的属性 }
注意,如果要在循环中获取对象的属性,不能够使用对象.属性名
的方式,而应该使用对象[属性名]
的方式,例如:
...... for(var a in p1){ alert(a + ":" +p1.a); //该方式获取的p1.a的值为undefined alert(a + ":" + p1[a]) //正确获取属性的方式 }
下面是类和对象中一些有用的方法。
- instanceof:判断一个对象是不是某种类型。
- constructor:返回对象的构造函数。
- prototype:获取类的prototype对象。
- propertyIsEnumerable(property):是否是可枚举的属性。
- hasOwnProperty(property):是否属于本类定义的属性。
- isPrototypeOf(Object):是否是指定类的prototype。
- toString():返回对象对应的字符串。
- valueOf():返回对象对应的原始类型值。
关于这些方法在后面介绍对象原型的时候还会详细介绍。
最后提一点是JavaScript中提供了一种主动释放内存的方法:delete 对象名称.属性。