你不知道的JavaScript(五)内置对象模版

尽管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对象模版作为一个例子,其他的内置对象模版都可以有类似的操作。

上一篇:C++ 底层分析 2.构造-析构,继承


下一篇:CM10 WIFI连不上解决方案