1.var和function关键字
javascript最基本的声明变量和函数的关键字
用法不再赘述。
2.文字量
文字量是javascript的常量,javascript的文字量有两种:数字和字符串
数字既可以是整型,又可以是实型,由于javascript不严格的类型检查,这两种文字量也可以相互隐式地转换,比如
实际上是没有严格的区别的,只有用严格相等比较运算符 === 之类的运算符时,才体现出不同。
3.new关键字
使用new关键字来创建对象
Array是js的内置对象,可以认为已经被定义过了。
4.[]运算符和.运算符
一般来说,对象会有属性,(在c++中一般被叫做成员)跟c++和java类似,js中可以用.运算符来访问对象的属性。除此之外,[]运算符可以用来访问字符串形式的属性名
假设访问window.location
跟下面的方式是一样的
甚至可以这样访问
var p="location";
alert(window[p]);
当中括号[]内是数字型文字量的时候,数字被用作索引号.不是所有的对象都可以使用索引号,典型的例子IE DOM中的document.all 和js内置对象Array都能使用索引号,document.all的属性如果有名字,那么既能通过名字访问它,又能通过索引号访问它。
索引号不能当作名字使用,所以对数组来说,他的所有成员是它的属性 但以下代码不可用
5.函数和函数对象
js把函数看作一种对象
可以用这样的代码创建函数
var add=new Function("a","b","return a+b;");
alert(add(10,5));
Function的最后一个参数是函数对象的函数体,可以是字符串形式的表达式或者一段代码,其他参数是函数对象的参数。
这跟
效果是一样的。
但如果用alert(add);观察的话,会发现二者的不同
使用构造函数Function创建的函数是
可以看到,这里函数对象的名字和函数名是不一样的,它使用了默认的名字。
但是anonymous是不可用的。
进一步进行研究,用下面的代码来构造一个函数
运行结果如预期为37。
那么此时add2函数是什么样的呢?用alert(add2);观察看到
可见,由这种方法构造出的函数对象名和函数名也是不同的。
但此时add也是可用的。
出于好奇,我测试了如下代码
发现竟然也显示37,这样Function构造函数对象过程就比较清晰了。
6.自己定义的类
多数情况下自定义类的方法是使用构造函数
这样就定义了一个类Class并创建了它的一个实例对象obj
由这里可以看出,内置对象如Array 肯定在某处存在着其构造函数的定义,只不过js程序的写者无法看到。
如果基于5所述函数对象的思想,为这个类定义方法(成员函数)跟为它定义属性没什么区别。
可以在构造函数中为它定义,也可以把预先写好的函数赋值给它,或者new Function构造。
7.this关键字
this在全局范围内为window对象
this在全局函数内也是window对象
this在对象的方法中指向对象,比如
obj.meth1()中如果出现了this,那么this就代表obj,这样,在对象的方法中就可以访问该对象的属性了。
值得注意的是,函数对象相互赋值时this的意义转变
比如 如果使用了 img.onclick=obj.meth1;(img是一个图片,obj是一个自定义对象)
那么 onclick中的this指针就无法访问obj的成员了,这样做的结果很容易出现错误。所以应该避免2个方法间的相互赋值。
8.javascript对象深入研究
我发现javascript似乎只把变量区分作三种类型:内置对象,函数对象,自定义对象
其表现为alert(内置对象);你将会看到特定的字符串,比如,整数和实数对象会被显示作十进制,字符串对象会被直接显示,数组对象会显示它的所有成员并用逗号分隔等等。
alert(函数对象);你将看到函数体内容,如果这个函数是内置函数或者DOM成员函数如alert(document.write);那么其代码部分看不到。
alert(自定义对象);看到的只是[object]
这个区分只是个人的看法,只是为了表述方便,并非严格的划分。
进一步测试 发现:
1.所有的对象都能互相赋值,左值类型会被右值"覆盖"
2.所有自定义对象的所有成员都被认为是存在的!如果没有定义,那么就是undefined。
由此所有自定义对象实际上都属于一个类!
所以创建类的行为实际上只是对某个对象的特定成员赋值
var a=new obj();
实际上是由new创建了一个新对象,然后把obj当作它的成员方法调用。
那么 obj()函数内的 this.propX=propX 就把原来值为undefined的成员制改成了propX
一个已经存在的对象则可以任意的为它添加属性,下面的代码为document添加了属性,不妨一试:
8.继承
众所周知,js是没有类的继承机制的,但是可以模拟实现。
根据上文的讨论,javascript没有public和private的区别,所以继承就是把某个类的所有属性和方法都添加到一个新类中
实现继承可以有这样的做法:
这个时候 b就具有了classA和classB的
所有属性
如果把它放到构造函数中去 就实现了继承
这样多继承也很容易实现
classA继承了classB和classC的所有属性和方法,注意这时,classC的属性和方法会覆盖掉classB中的同名属性和方法
之前在网上也看到不少模拟继承机制的方法,有兴趣可以参考:
(1)使用Prototype(http://blog.csdn.net/s3n/archive/2006/06/29/852039.aspx)
(2)调用父类构造函数(http://blog.sina.com.cn/u/490d26b4010005qj)
(3)原型继承(http://www.nirvanastudio.org/javascript/classical-inheritance-in-javascript.html)
对上面三种方法我个人比较喜欢第2种
但是这会为classA添加一个额外的属性parent
如果不需要的话也可以把它去掉
这样效果就和我前面写的方法完全一样了。