悟透JavaScript之奇妙的对象
来源:互联网 发布:联合国五常知乎 编辑:程序博客网 时间:2024/03/29 23:43
先来说说函数的对象化能力。
任何一个函数都可以为其动态地添加或去除属性,这些属性可以是简单类型,可以是对象,也可以是其他函数。也就是说,函数具有对象的全部特征,你完全可以把函数当对象来用。其实,函数就是对象,只不过比一般的对象多了一个括号“()”操作符,这个操作符用来执行函数的逻辑。即,函数本身还可以被调用,一般对象却不可以被调用,除此之外完全相同。请看下面的代码:
functionSing()
{
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类型一样的东西,这种东
西被我们称为“对象”。我们的确可以这样去看待这些“对象”,因为它们既有“属性”也有“方法”嘛。但下面
的代码又会让我们产生新的疑惑:
varanObject = {};//一个对象
anObject.aProperty = "Property of object";//对象的一个属性
anObject.aMethod =function(){alert("Method of object")};//对象的一个方法
//主要看下面:
alert(anObject["aProperty"]);//可以将对象当数组以属性名作为下标来访问属性
anObject["aMethod"]();//可以将对象当数组以方法名作为下标来调用方法
for(varsinanObject) //遍历对象的所有属性和方法进行迭代化处理
alert(s + " is a " +typeof(anObject[s]));
同样对于 function类型的对象也是一样:
varaFunction = function(){}; //一个函数
aFunction.aProperty = "Property of function"; //函数的一个属性
aFunction.aMethod =function(){alert("Method of function")}; //函数的一个方法
//主要看下面:
alert(aFunction["aProperty"]); //可以将函数当数组以属性名作为下标来访问属性
aFunction["aMethod"](); //可以将函数当数组以方法名作为下标来调用方法
for(varsinaFunction) //遍历函数的所有属性和方法进行迭代化处理
alert(s + " is a " +typeof(aFunction[s]));
是的,对象和函数可以象数组一样,用属性名或方法名作为下标来访问并处理。那么,它到底应该算是数组呢,还是算对象?
我们知道,数组应该算是线性数据结构,线性数据结构一般有一定的规律,适合进行统一的批量迭代操作等,有点像波。而对象是离散数据结构,适合描述分散的和个性化的东西,有点像粒子。因此,我们也可以这样问:JavaScript里的对象到底是波还是粒子?如果存在对象量子论,那么答案一定是:波粒二象性!
因此,JavaScript里的函数和对象既有对象的特征也有数组的特征。这里的数组被称为“字典”,一种
可以任意伸缩的名称值对儿的集合。其实,object和function的内部实现就是一个字典结构,但这种字
典结构却通过严谨而精巧的语法表现出了丰富的外观。正如量子力学在一些地方用粒子来解释和处理问题,
而在另一些地方却用波来解释和处理问题。你也可以在需要的时候,自由选择用对象还是数组来解释和处
理问题。只要善于把握JavaScript的这些奇妙特性,就可以编写出很多简洁而强大的代码来。
- 悟透JavaScript之奇妙的对象
- 悟透JavaScript-奇妙的对象
- 悟透JavaScript - 奇妙的对象
- 《悟透JavaScript》学习札记五之奇妙的对象
- 悟透JavaScript(李站老师)-奇妙的对象
- 《悟透javascript》学习笔记:五、奇妙的对象
- 尝试的奇妙之处
- EXT的奇妙之旅
- 奇妙的三子棋之旅
- ++运算的奇妙之处
- table的奇妙之处
- Linux C之奇妙的字符串世界
- 探究Linux的奇妙之旅
- JavaScript之对象的遍历
- JavaScript之对象的属性
- Javascript之对象的继承
- 面向对象的javascript之对象操作
- javascript的浏览器对象之window对象
- 文本搜索器
- DLL导出
- UVA10250-另两棵树
- ECMA262 Edition5. Function.prototype.bind
- 加载DLL
- 悟透JavaScript之奇妙的对象
- 远程DLL
- UVA10387-台球
- 【ZOJ3587】Marlon's String——白四爷×KMP 白濑肆の算法完全解读KMP篇 KMP来袭第二弹前缀什么的果然最讨厌了!【1.0%达成!】
- ASP.Net 之 System.Collections.Generic 下的容器类
- 使用servlet生成图片验证码
- UVA10392-大数分解
- staic(静态)变量的作用
- UVA10420-战利品列表