在javascript中,可以通过构造方法和对象字面量的方式定义对象。
前者通过实例化一个对象,再在这个对象的基础上添加属性和方法,如:var person = new Object(); person.name = "lee"; person.callName = function(){ alert(this.name); }
这种方法简单,直接,但感觉也太随意了,当需要定义大量的属性或方法时,会给人一种凌乱不堪的感觉。
我自己就更偏向于以对象字面量的方式来定义,如上面这个例子,可以这样写:var person = { name:"lee", callName:function(){ alert(this.name); } }
这种方式看起来非常清晰,一目了然。我觉得非常好,另外,很多优秀的框架利用JS对象的这个特性来实现可选参数机制,特别是一个函数带有大量的可选方法时,将可选参数以一个对象字面量的形式传入,再在函数里面作处理,是非常好的选择。下面是一个关于可选参数的例子:
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来取相应的属性值,而中括号法则能很直观,简单地实现。如:
var person = { name:'waitat' }; //点号法 var attributeName = "name"; alert(person.attributeName);//undefined alert(person[attributeName]);//waitat
看到了吗?这就是差距了。呵呵