尽管JavaScript中有对象的概念,但一般我们并不说JavaScript是面向对象的编程语言,因为它不具备面向对象的一些最基本特征。
在c++/Java等这些面向对象的编程语言中,我们要定义一个对象,就必须要先把对象的一些特征抽象出来,也就是说我们必须先定义一个类,然后以这个类作为模版来创建对象。JS有些不同,可以直接以字面量的形式创建对象,代码如下:
<script type="text/javascript">
var obj = {
name:"Jane",
age:30,
getInfo:function(){
return "name:"+ this.name +" "+"age:" + this.age;
}
}
alert(typeof obj);//object
alert(obj.getInfo());//name:Jane age:30
</script>
JS可以通过{}形式来创建对象,在上面代码中,我们创建了一个对象,赋值给obj变量,该对象有两个成员属性,和一个成员方法。这是创建对象的一种较为简单的方式,接下来我们在来看看另外一种比较普遍的形式。
可能你会想到面向对象语言中的”类”,如果你阅读过ECMAScript规范,你会发现,在ECMAScript规范中,我们甚至几乎找不到”类”(class)的概念,取而代之的是”Object”,为了和对象(object)进行区分,笔者喜欢把它称为对象模版。
这里我们不得不深入的了解一下JS的函数,JS的函数比较特殊,主要有两个作用:
第一个用途是和一般的面向过程语言(如c语言)中函数作用相同:將特定功能的代码进行封装,作为一个功能模块,以达到代码重用的目的。
另外一个作用就是作为对象模版来构造对象。看下面的代码:
<script type="text/javascript">
function func(name,age)
{
this.name = name;
this.age = age;
return "name:"+name + " " + "age:" + age;
}
var info = func("Bob",20);//调用函数
var person = new func("Smith",30);//创建对象
alert(typeof info);//string
alert(typeof person);//object
</script>
我们定义了一个func,可以把它用作两中用途:
var info = func("Bob",20);//调用函数
此处为函数调用,该函数调用返回一个字符串,当我们在前面加上一个new关键字的时候,意义就完全不一样了。
var person = new func("Smith",30);//创建对象
此时函数就变成了对象模版,它又有点类似于java/c++中的构造函数,可以使用参数对成员属性进行初始化。
JS提供了一些内置的函数(或者说是对象模版),比较常用的有:
- String()
- Number()
- Boolean()
- Array()
- Object()
- Function()
- RegExp()
- Date()
- Error()
- Symbol()— ES6新增!
如果你对Java比较熟,你会发现这里的String()有点类似于Java中的String(..)构造函数,我们可以通过下面这种形式创建一个字符串对象:
<script type="text/javascript">
var strObj = new String("hello world!");
alert(typeof strObj);//object
alert(strObj instanceof String);//true
alert(strObj);
</script>
需要注意的是,这里的strObj是对基本类型string进行包装后的object类型。string和String之间的关系有点类似于Java中的int和Integer。
既然有了string类型,为什么JavaScript还会提供内置对象模版String呢?看下面的例子:
String.prototype.getLen = function()
{
return this.length;
}
var strObj = new String("hello world!");
alert(strObj.getLen());
有时候我们需要对字符串增加自定义的操作,例如这里我们可以增加一个getLen方法获取字符串的长度,我们只需要使用prototype属性对String进行扩展即可(有JS基础的朋友应该知道是怎么回事,这里不做过多介绍)。
这里我们只是以String对象模版作为一个例子,其他的内置对象模版都可以有类似的操作。