悟透JavaScript(5)

作者:李战 来源:软件真谛 时间:2008-05-29 22:15:00 

奇妙的对象

先来说说函数的对象化能力。

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

    function Sing()
    {
        with(arguments.callee)
          alert(author + ":" + poem);
    };
    Sing.author = "李白";
    Sing.poem = "汉家秦地月,流影照明妃。一上玉关道,天涯去不归";
    Sing();
    Sing.author = "李战";
    Sing.poem = "日出汉家天,月落阴山前。女儿琵琶怨,已唱三千年";
    Sing();

在这段代码中,Sing函数被定义后,又给Sing函数动态地增加了author和poem属性。将author和poem属性设为不同的作者和诗句,在调用Sing()时就能显示出不同的结果。这个示例用一种诗情画意的方式,让我们理解了JavaScript函数就是对象的本质,也感受到了JavaScript语言的优美。

好了,以上的讲述,我们应该算理解了function类型的东西都是和object类型一样的东西,这种东西被我们称为“对象”。我们的确可以这样去看待这些“对象”,因为它们既有“属性”也有“方法”嘛。但下面的代码又会让我们产生新的疑惑:

    var anObject = {};  //一个对象
    anObject.aProperty = "Property of object";  //对象的一个属性
    anObject.aMethod = function(){alert("Method of object")}; //对象的一个方法
    //主要看下面:
    alert(anObject["aProperty"]);   //可以将对象当数组以属性名作为下标来访问属性
    anObject["aMethod"]();          //可以将对象当数组以方法名作为下标来调用方法
    for( var s in anObject)           //遍历对象的所有属性和方法进行迭代化处理
        alert(s + " is a " + typeof(anObject[s]));
    同样对于function类型的对象也是一样:
    var aFunction = function() {};  //一个函数
    aFunction.aProperty = "Property of function";  //函数的一个属性
    aFunction.aMethod = function(){alert("Method of function")}; //函数的一个方法
    //主要看下面:
    alert(aFunction["aProperty"]);   //可以将函数当数组以属性名作为下标来访问属性
    aFunction["aMethod"]();          //可以将函数当数组以方法名作为下标来调用方法
    for( var s in aFunction)           //遍历函数的所有属性和方法进行迭代化处理
        alert(s + " is a " + typeof(aFunction[s]));

是的,对象和函数可以象数组一样,用属性名或方法名作为下标来访问并处理。那么,它到底应该算是数组呢,还是算对象?

我们知道,数组应该算是线性数据结构,线性数据结构一般有一定的规律,适合进行统一的批量迭代操作等,有点像波。而对象是离散数据结构,适合描述分散的和个性化的东西,有点像粒子。因此,我们也可以这样问:JavaScript里的对象到底是波还是粒子?

如果存在对象量子论,那么答案一定是:波粒二象性!

因此,JavaScript里的函数和对象既有对象的特征也有数组的特征。这里的数组被称为“字典”,一种可以任意伸缩的名称值对儿的集合。其实, object和function的内部实现就是一个字典结构,但这种字典结构却通过严谨而精巧的语法表现出了丰富的外观。正如量子力学在一些地方用粒子来解释和处理问题,而在另一些地方却用波来解释和处理问题。你也可以在需要的时候,自由选择用对象还是数组来解释和处理问题。只要善于把握JavaScript的这些奇妙特性,就可以编写出很多简洁而强大的代码来。

标签:javascript,对象,编程,函数
0
投稿

猜你喜欢

  • 你的网站使用了微格式了么

    2009-05-21 12:10:00
  • 安装MySQL的步骤和方法

    2009-07-30 08:38:00
  • Python中的 enum 模块源码详析

    2021-11-19 04:11:10
  • Go语言从单体服务到微服务设计方案详解

    2023-09-02 02:45:57
  • QT连接Oracle数据库并实现登录验证的操作步骤

    2024-01-27 13:06:44
  • pycharm解决关闭flask后依旧可以访问服务的问题

    2023-12-27 06:39:27
  • Python数据分析之 Matplotlib 散点图绘制

    2021-09-19 07:05:46
  • 5个css+div导航菜单

    2011-04-29 12:38:00
  • js格式化金额可选是否带千分位以及保留精度

    2023-10-06 04:03:14
  • Python asyncore socket客户端实现方法详解

    2022-06-18 14:17:42
  • Python表达式的优先级详解

    2021-09-21 14:24:59
  • SQL Server附加数据库时出现错误的处理方法

    2024-01-20 19:57:58
  • javascript中parseInt()函数的定义和用法分析

    2024-04-22 22:44:16
  • python操作字典类型的常用方法(推荐)

    2023-01-17 17:05:33
  • python pandas库的安装和创建

    2023-09-25 22:49:02
  • TensorFlow实现自定义Op方式

    2021-11-01 15:56:38
  • SQL SQL Server 2008中的新日期数据类型

    2009-03-10 15:01:00
  • Uchome1.2 1.5 代码学习 common.php

    2023-11-15 02:56:10
  • MySQL中BIGINT数据类型如何存储整数值

    2024-01-23 21:15:45
  • python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法

    2021-01-03 05:25:29
  • asp之家 网络编程 m.aspxhome.com