参考了leadzen的blog:
http://www.cnblogs.com/leadzen/archive/2008/02/25/1073404.html
一、对象的种类
有两类:
1.非Function对象,也可以说是非function实体,我们将它称为普通对象吧
2.Function对象,也可以称之为function实体
那么Function对象和普通对象有什么区别呢?
答案是:Function对象可以像普通对象一样的被使用,当加上括号和参数时也可以当成函数来使用,当与new结合使用时可以生成普通对象
二、对象的构成.使用
(1)javascript的对象是由属性和Function对象属性构成的
(2)引用对象中的属性的方式和java是一样的,也是通过点(.)操作符来引用的
三、对象的创建
我们现在开始来阐述javascript的对象创建.共有4种方式.
1、json(JavaScript Object Notation)形式创建对象.这种形式适用于灵活性强的地方
例子1
<html> <head> <title>generate object --gson form</title> <script type = "text/javascript"> //定义对象tester,通过json的形式 var tester = { //普通属性 attrB:true, //Function对象属性 action:function(){alert("hello world");} }; </script> </head> <body> <script type = "text/javascript"> //使用对象tester alert(tester.attrB); tester.action(); </script> </body> </html>
这种方式通过key--value来定义对象及其对象属性
那么这些key均为该对象的属性
在他定义完为止,事实上他还拥有从其原型链继承过来的属性
但是小心,他访问不了prototype这个属性
关于原型链,我们后续会说到的
例如子象的属性tester对象在定义完成的时候就只有attrB和action两个属性,还有从其原型链继承过来的属性
2、当遇到json形式的字符串时,可以通过使用eval函数这个强大的数码转换引擎
得到一个JavaScript内存对象
那么这个对象他拥有哪些属性呢?
(1)在字符串内部定义的key属性
(2)通过原型链继承过来的属性
(3)后续添加的属性
3、通过function定义
或者new Function(......)
这两种方式生成Function对象(也称之为function实体)
哪些是他的属性
刚定义完时,Function对象的具有从其原型连继承过来的属性,没有其他属性
(1)prototype(这个属性在普通对象中是没有的)
在JavaScript中所有对象的原型引用。是JavaScript实现对象继承的主要手段
关于prototype请参考http://silentjesse.iteye.com/blog/981189
(2)toString
Function对象内部方法,如果是自定义Function,
则返回Function对象的完整定义,反之返回以下格式的字符串:
Function functionname( ) { [native code] }
例如:
<html> <head> <title>Function object</title> <script type = "text/javascript"> var fun = function(){ var str = "hello,world"; alert(fun.caller); this.attrI = 123; } var fun2 = new Function("alert(\"hello,world\");") </script> </head> <body> <script type = "text/javascript"> alert(fun.toString());//输出:function () {var str = "hello,world";alert(fun.caller);this.attrI = 123;} alert(fun2.toString());//输出:function anonymous() {alert("hello,world");} alert(Function.toString());//输出:function Function() {[native code]} </script> </body> </html>
(3)constructor,表示当前对象的构造方法
也是实现对象继承的主要手段,通过该属性可以有效地区别当前对象的构造方法。
(4)valueOf,同toString类似
如果是自定义Function则返回Function对象的完整定义,反之返回相应格式的字符串
(5)apply
(6)call
如果还想要其他属性则可以像普通对象一样动态的添加,后续会详细说明的
4、通过Function对象(function实体)来new来生成一个普通对象
这个普通的对象拥有哪些属性呢?
目前我所知道的是
(1)在Function对象定义的{} 体内与this绑定的属性
(2)原型链继承过来的属性
(3)定义后再添加的属性
总结:方式1和方式2其实类似于
var obj = new Object; obj.attr1 = "1"; obj.attr2 = "2";
也就是说先用ObjectFunction对象new了一个普通对象,然后再往这个对象中添加属性
四、对象的属性
从上面的"对象的创建",我们可以得出对象的属性来源共有4种
1、定义时自定义的属性
2、原型链继承过来的属性
3、在Function对象定义的{} 体内与this绑定的属性
4、为对象(不管是普通对象还是Function对象)添加属性
请先看一下以下的这个例子:
var life = {}; for(life.age = 1; life.age <= 3; life.age++) { switch(life.age) { case 1: life.body = "卵细胞"; life.say = function(){alert(this.age+this.body)}; break; case 2: life.tail = "尾巴"; life.gill = "腮"; life.body = "蝌蚪"; life.say = function(){alert(this.age+this.body+"-"+this.tail+","+this.gill)}; break; case 3: delete life.tail; delete life.gill; life.legs = "四条腿"; life.lung = "肺"; life.body = "青蛙"; life.say = function(){alert(this.age+this.body+"-"+this.legs+","+this.lung)}; break; }; life.say(); };
从这个例子中可以看到吧..一个对象其属性是可以动态的添加和删除的
这段JavaScript程序一开始产生了一个生命对象life,life诞生时只是一个光溜溜的对象,没有任何属性和方法。在第一次生命过程中,它有了一个身体属性body,并有了一个say方法,看起来是一个“卵细胞”。在第二次生命过程中,它又长出了“尾巴”和“腮”,有了tail和gill属性,显然它是一个“蝌蚪”。在第三次生命过程中,它的tail和gill属性消失了,但又长出了“四条腿”和“肺”,有了legs和lung属性,从而最终变成了“青蛙”。如果,你的想像力丰富的话,或许还能让它变成英俊的“王子”,娶个美丽的“公主”什么的。
不过,在看完这段程序之后,请你思考一个问题:"我们一定需要类吗?"
还记得儿时那个“小蝌蚪找妈妈”的童话吗?也许就在昨天晚,你的孩子刚好是在这个美丽的童话中进入梦乡的吧。可爱的小蝌蚪也就是在其自身类型不断演化过程中,逐渐变成了和妈妈一样的“类”,从而找到了自己的妈妈。这个童话故事中蕴含的编程哲理就是:对象的“类”是从无到有,又不断演化,最终又消失于无形之中的...
“类”,的确可以帮助我们理解复杂的现实世界,这纷乱的现实世界也的确需要进行分类。但如果我们的思想被“类”束缚住了,“类”也就变成了“累”。想象一下,如果一个生命对象开始的时就被规定了固定的“类”,那么它还能演化吗?蝌蚪还能变成青蛙吗?还可以给孩子们讲小蝌蚪找妈妈的故事吗?
所以,JavaScript中没有“类”,类已化于无形,与对象融为一体。正是由于放下了“类”这个概念,JavaScript的对象才有了其他编程语言所没有的活力。
如果,此时你的内心深处开始有所感悟,那么你已经逐渐开始理解JavaScript的禅机了
五、其他特性
1.继承