JavaScript中的对象是一个难点,理解起来和其他面向对象的语言有所不同,这点可能和JavaScript的历史有关。因为当年Netscape设计这个语言时,仅仅是希望进行简单的表单处理的。由于设计目的的不同,JavaScript肯定就走简化路线,不会像Java、C++这样走大而全的路线。
但作为一个语言,总要有自定义类型这个部分,作为现实的业务逻辑的抽象,肯定是千变万化,所以定义、使用都需要灵活和简单并存,JavaScript这里做的非常漂亮。
和Java一样,JavaScript里面也可以把一切都看成对象,String,Date,Array都是内置的对象,甚至Function也是对象!所以,理解对象对于学好JavaScript有非常重要的意义。
这里先讲讲JavaScript的对象创建。
1. 字面量直接定义
JavaScript的语法真的也挺松散的,这样直接写也行,基本上就和写一个JSON文件类似。
比如:
var person = { firstName:"John", lastName:"Doe", age:50, eyeColor:"blue" };这里就定义了一个person对象,有firstName、lastName、age、eyeColor四个属性。
2. 直接创建
这里指可以用Object这个内置的根对象来生成一个对象,然后逐项指定属性值。
var person=new Object(); person.firstname="John"; person.lastname="Doe"; person.age=50; person.eyecolor="blue";这里更进一步,我们可以运用工厂模式,把生成对象的代码封装起来,看代码吧:
function createPerson(fname, lname, age, color) { var o = new Object(); o.firstname = fname; o.lastname = lname; o.age = age; o.eyecolor = color; return o; } var person = createPerson("John", "Doe", 50, "blue");调用工厂模式会生成一个产品,也就是一个拥有需要的属性的对象。
3. 构造函数
这个概念应该是吸取了其他面向对象的语言的经验了,用构造函数来生成一个对象,对于大部分程序员来说都是天经地义的。当然,这个构造函数有它特殊的地方。
function Person(fname, lname, age, color) { this.firstname = fname; this.lastname = lname; this.age = age; this.eyecolor = color; } var person = new Person("John", "Doe", 50, "blue");我们可以看到,工厂模式会返回一个对象,但构造函数没有返回值,里面也是通过this这个关键词在操作;另外,生成具体的实例时,使用了new这个关键词。
实际上,遇到new这个关键词时,会在内存里面生成一个对象,当调用构造函数时,函数里面的this,就是指这个对象,所以就顺理成章的初始化了一个对象,并且不需要返回值。
顺便啰嗦一句,通常我们把构造函数第一个字面大写,其他函数第一个字母小写,函数名一般都采用驼峰命名法。
应该说这3种方法都可以使用,但还是有细微区别:
字面量定义一个特定对象确实方便,但不适合定义大量对象,所以往往用在定义全局的一个对象上;
工厂模式呢,从代码我们可以看到,new出来的是一个Object类型的对象,所以用instanceof看类型时,发现对象是Object类型,不是Person类型,也就是说,自定义类型的概念弱了;
构造函数看起来最有面向对象的气息,用instanceof看类型时,也确实发现是Person类型,所以使用最多,当然,也会有其他一些问题,我们下面慢慢再讲。