创建对象一
ECMAScript中的对象其实就是一组数据和功能的集合。对象可以通过执行new操作符后跟要创建的对象类型的名称来创建。而创建Object类型的实例并为其添加属性和方法,就可以创建自定义对象,如下所示:
var o = new Object();
o.name = "Alvin"; //添加属性
//添加方法
o.sayHello = function(){
console.log("hello "+ this.name);
}
这个语法与Java中创建对象的语法相似,但在JavaScript中,如果不给构造函数传递参数,则可以省略后面的那一对圆括号。也就是说在像前面这个示例一样不传递参数的情况下,完全可以省略那对圆括号(但并不推荐这种做法)
var o = new Object; //有效,但不推荐
仅仅创建一个Object实例其实并没有什么用处,但关键是要理解一个重要思想:即在JavaScript中,Object类型是所有其它实例的基础,在讲继承的时候我们已经讲到:所有其它类型均继承自Object。也就是说Object类型所具有的任何属性和方法,同样也都存在于更具体的对象中。
Object的每个实例都具有如下属性和方法:
- Costructor:保存着用于创建对象的函数,对于上面的例子而言,构造函数(constructor)就是Object()
- hasOwnProperty(propertyName):用于检查给定的属性在当前的实例对象(不是在实例原型)中是否存在。其中作为参数的属性名(propertName)必须以字符串形式指定,例如:o.hasOwnProperty("name")
- isPropertyOf(object):用于检查传入的对象是否是另一个对象的原型
- propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句来枚举。与hasOwnProperty()方法一样,作为参数的属性名必须以字符串形式指定。
- toLocalString():返回对象的字符串表示形式,该字符串与执行环境的地区对应。
- toString():返回对象的字符串表示形式。
- valueOf():返回对象的字符串、数值或布尔值表示,通常与toString()方法的返回值相同。
由于在JavaScript中Object是所有对象的基础,因此所有对象都具有这些基本的属性和方法。
创建对象二
另一种创建对象的方式是使用对象字面量的表示法。对象字面量是对象定义的一种简写形式。目的在于简化创建包含大量属性的对象的过程。看一下下面的例子:
var person = {
name: "Alvin", //添加name属性
//添加sayHello方法
sayHello:function(){
console.log("Hello "+ this.name)
}
}
在使用对象字面量时,属性名也可以使用字符串,如下所示:
var person = {
"name": "Alvin",
"Age": 28,
5: true
}
在这个例子中我们创建了一个person对象,包含三个属性,name、age和5。但这里数值属性名会自动转换为字符串。
另外,使用对象字面量语法时,如果花括号里面的内容为空,则可以在外面动态添加属性或方法,如下所示:
var person = {}; //与new Object()相同
person.name = "Alvin";
person.sayHello = function(){
console.log(this.name);
}
总结
虽然可以使用前面介绍的任何一种方式创建对象,但平时我们更青睐使用对象字面量语法,因为这种语法要求的代码量少,而且能够给人封装数据的感觉。实际上对象字面量也是向函数传递大量可选参数的首先方式。看下面的例子:
function dispalyInfo(args){
var output = "";
if(typeof args.name == "string"){
output += "Name: " + args.name + "\n";
}
if(typeof args.age == 'number'){
output += "Age: " + args.age + "\n";
}
console.log(output);
}
displayInfo({
name: "Alvin",
Age: 28
});
displayInfo({
name: "yannis"
});
这个例子中,函数displayInfo接受一个名为args的参数,这个参数可能带有一个名为name或age的属性,也可能是两个属性都有或者是都没有。在函数内部,通过typeof操作符来检测每个属性是否存在,然后再基于相应的属性来显示信息。
一般情况,访问对象的属性时都是使用点表示法,这也是很多面向对象语言的通用方法。但是在JavaScript中也可以用方括号像数组一样来访问属性。在使用方括号时,需将要访问的属性以字符串的形式放在方括号内。如下所示:
console.log(person["name"]);
console.log(person.name);
以上两种方式都是可以的,从功能上看这两种访问方式没有任何区别。但方括号访问的主要有点事可以通过变量的形式来访问属性,例如:
var proName = "name";
console.log(person[proName]); //Alvin
如果属性名中包含会导致语法错误的字符,或者属性名使用的是关键字或保留字,也可以使用方括号形式访问,如:
person["first name"] = "Alvin";
由于"first name"中包含空格,因此不能直接使用点的形式来访问。然而属性名中也可以包含非字母非数字,这时候就可以使用方括号的形式来访问它们了。
通常,除非必须使用变量来访问属性,否则建议使用点表示法。