研磨JavaScript系列(五):奇妙的对象

在JavaScript中,只有object和function两种东西有对象化的能力。我们先来说说函数的对象化能力。

任何一个函数都可以为其动态地添加或去除属性,这些属性可以是简单类型,可以是对象,也可使其他的函数。也就是说,函数具有对象的全部特征,完全可以把函数当对象来用。其实,函数就是对象,只不过比一般的对象多了一个括号"()"操作符,这个操作符用来执行函数的逻辑,即函数本身还可以被调用,一般对象不可以被调用。除此之外,完全相同。

<script type="text/javascript">
    function sing(){
        alert(sing.author + "正唱着" + sing.song);
    }

    sing.author = "张信哲";
    sing.song = "爱如潮水";
    sing();    //输出张信哲正唱着爱如潮水

    sing.author = "林志炫";
    sing.song = "蒙娜丽莎的眼泪";
    sing();    //输出林志炫正唱着蒙娜丽莎的眼泪
</script>

在这段代码中,sing函数被定义后,又给sing函数动态的增加了author和song属性。将author和song属性设为不同的演唱者和歌曲,在调用sing()时,就能显示出不同的结果。这个示例让我们理解了JavaScript函数就是对象的本质,也感受到了JavaScript语言的优美。

我们应该是理解了function类型的东西都是和object类型一样的东西,这种东西被我们称为对象。我们的确可以这样去看待这些对象,因为它们既有属性,也有方法。

我们看下面的代码,可能会让我们产生新的疑惑。

 1 <script type="text/javascript">
 2     var anObject = {};
 3     anObject.aProperty = "Property of object";  //对象的一个属性
 4     anObject.aMethod = function(){ alert("Method of object"); };  //对象的一个方法
 5 
 6     alert(anObject["aProperty"]);   //可以将对象当数值以属性名作为下标来访问属性
 7     alert(anObject["aMethod"]);     //可以将对象当数组以方法名作为下标来访问方法
 8 
 9     //遍历对象所有属性和方法进行迭代处理
10     for (var s in anObject){
11         alert(s + " is a " + typeof(anObject[s]));
12     }
13 </script>

对于function类型的对象也一样

 1 <script type="text/javascript">
 2     var aFunction = function(){};  //一个函数
 3     aFunction.aProperty = "Property of object";  //函数的一个属性
 4     aFunction.aMethod = function(){ alert("Method of object"); };  //函数的一个方法
 5 
 6     alert(aFunction["aProperty"]);   //可以将函数当数组以属性名作为下标来访问属性
 7     alert(aFunction["aMethod"]);     //可以将函数当数组以方法名作为下标来访问方法
 8 
 9     //遍历函数所有属性和方法进行迭代处理
10     for (var s in aFunction){
11         alert(s + " is a " + typeof(aFunction[s]));
12     }
13 </script>

是的,对象和函数可以入数组一样,用属性名或方法名作为下标来访问并处理。

文章声明:本文部分内容参考自《悟透JavaScript》,这是一本学习JavaScript非常好的书。

原文地址:https://www.cnblogs.com/HLiang/p/wonderful_object.html