最近研究了一下JavaScript语言,发现这门语言表面上简单易学,实际上深不可测。它实现了ECMAScript标准(欧洲计算机制造商下属委员会制定的脚本语言标准),但是这个标准里面是没有“类”的概念。所以在这门语言里提到对象,实际上和在C++,C#,Java中的对象有些不同。在JS中,一切都是对象,甚至包括函数。而对象,就是一组散列表,或是名值对。比如我们创建一个小狗对象:
var dog_01=new Object(); dog_01.name="Kitty"; dog_01.age=2; dog_01.sayName=function(){alert(this.name);}; dog_01.sayName();
这是一种很简单的创建对象的方式。但我想大家也会感觉这种方式不太好,因为代码会显得冗余。假如我要再创建一个dog_02对象,我基本上就是要把上面的代码重新再写一遍。所以这样的程序显然是不好的,那么我们可以试着把创建对象的步骤给封装在一个函数里面,给它起个名字,叫createDog().
function createDog(name, age) { var o = new Object(); o.name = name; o.age = age; o.sayName = function() { alert(this.name); }; return o; } var dog_01 = createDog("Candy", 3); var dog_02 = createDog("Mat", 3); var dog_03 = createDog("Undo", 3); alert(dog_01.sayName());//Candy alert(dog_02.sayName());//Mat alert(dog_03.sayName());//Undo
这种模式在软件工程里面被称之为“工厂模式”,这个方法就像是一个工厂一样,你不断地调用它,就会源源不断地加工出来一个个“Dog”成品出来。这种用函数封装具体创建对象细节的方法工作的很好,但是我们永久了会发现一个问题,就是这种方法创建出来的对象,是没有类型的。比如字符串对象可以是String类型,数字对象可以是Number对象,函数对象是Function类型,日期对象是Date类型,那这样去创建的一个对象算是什么类型呢?充其量就是一个Object类型罢了。
在很多编程语言里(如C#),想要创建一个具有特殊类型的对象,是需要用调用构造函数的。在JS里有一些“原生对象”,比如Data,Number,它们是直接存在于运行环境里面,不需要我们显示地去调用构造函数.如果我们想要创建自己定义的对象类型,就可以自己写构造函数,还可以添加自己的属性和方法,比如说这样:
function CreateDog(name, age) //构造函数一般大写字母开头 { this.name = name; this.age = age; this.sayName = function() { alert(this.name); }; } var dog_01 = new CreateDog("Lucky", 33);//new var dog_02 = new CreateDog("Mat", 3); var dog_03 = new CreateDog("Undo", 3); alert(dog_01.sayName()); //Candy alert(dog_02.sayName()); //Mat alert(dog_03.sayName()); //Undo
我对这个函数做了一点修改,然后被称作为所谓的“构造函数”,调用它的时候用了new关键字。其实构造函数与一般函数也没有啥区别,只要是用new去调用一个函数就称之为调用了构造函数。我们在这个函数里没有显示地创建一个对象,而是用了this关键字。也没有返回任何对象。因为用new就是在创建对象
浙公网安备 33010602011771号