在javascript中,可以通过构造方法和对象字面量的方式定义对象。
前者通过实例化一个对象,再在这个对象的基础上添加属性和方法,如:
代码语言:javascript复制var person = new Object();
person.name = "lee";
person.callName = function(){
alert(this.name);
}
这种方法简单,直接,但感觉也太随意了,当需要定义大量的属性或方法时,会给人一种凌乱不堪的感觉。
我自己就更偏向于以对象字面量的方式来定义,如上面这个例子,可以这样写:
代码语言:javascript复制var person = {
name:"lee",
callName:function(){
alert(this.name);
}
}
这种方式看起来非常清晰,一目了然。我觉得非常好,另外,很多优秀的框架利用JS对象的这个特性来实现可选参数机制,特别是一个函数带有大量的可选方法时,将可选参数以一个对象字面量的形式传入,再在函数里面作处理,是非常好的选择。下面是一个关于可选参数的例子:
代码语言:javascript复制function greeting(lastName,option){
var words = option.words || "Good morning!";
var prefix = option.prefix || "Mr";
alert(prefix lastName " " words);
}
greeting("lee",{});//Mr lee,Good morning
greeting("lee",{prefix:'Miss'});//Miss lee,Good morning
greeting("lee",{words:'Good afternoon',prefix:'Miss'});//Miss lee,Good afternoon
另外,关于取对象属性的问题,也有个地方值得一提。
取一个对象的某个属性,有两个方法:一是最常见的用点号(.)来取,如person.name,就是取对象person的name属性;其实还有另一种方法,就是用中括号([])来取,如取前面所述的person.name,也可以写作person["name"],当然,这样写不符合其它OOP语言的习惯,所以这种写法也并没有多少人喜欢用,但值得注意的是,当属性名是变量的时候,点号取属性值法不能或者说只能通过一些HACK来取相应的属性值,而中括号法则能很直观,简单地实现。如:
代码语言:javascript复制var person = {
name:'waitat'
};
//点号法
var attributeName = "name";
alert(person.attributeName);//undefined
alert(person[attributeName]);//waitat
看到了吗?这就是差距了。呵呵