Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 网站建设 > ASP.NET > 深入解析javascript对象
【标  题】:深入解析javascript对象
【关键字】:javascript
【来  源】:http://blog.csdn.net/dead_of_winter/archive/2006/12/28/1465440.aspx

深入解析javascript对象

Your Ad Here

 1.var和function关键字

javascript最基本的声明变量和函数的关键字
用法不再赘述。

2.文字量
文字量是javascript的常量,javascript的文字量有两种:数字和字符串
数字既可以是整型,又可以是实型,由于javascript不严格的类型检查,这两种文字量也可以相互隐式地转换,比如

var i=3;
var j="3";
i
=i+j;


实际上是没有严格的区别的,只有用严格相等比较运算符 === 之类的运算符时,才体现出不同。

3.new关键字

使用new关键字来创建对象

var k=new Array(6);

Array是js的内置对象,可以认为已经被定义过了。

4.[]运算符和.运算符
一般来说,对象会有属性,(在c++中一般被叫做成员)跟c++和java类似,js中可以用.运算符来访问对象的属性。除此之外,[]运算符可以用来访问字符串形式的属性名
假设访问window.location

alert(window.location);

 

跟下面的方式是一样的

alert(window["l"])

甚至可以这样访问

var p="location";
alert(window[p]);

当中括号[]内是数字型文字量的时候,数字被用作索引号.不是所有的对象都可以使用索引号,典型的例子IE DOM中的document.all 和js内置对象Array都能使用索引号,document.all的属性如果有名字,那么既能通过名字访问它,又能通过索引号访问它。

索引号不能当作名字使用,所以对数组来说,他的所有成员是它的属性 但以下代码不可用

var k=new Array(6);
k[
2]=10
;
alert(k.
2);

 

5.函数和函数对象
js把函数看作一种对象
可以用这样的代码创建函数

var add=new Function("a","b","return a+b;");
alert(add(
10,5));

Function的最后一个参数是函数对象的函数体,可以是字符串形式的表达式或者一段代码,其他参数是函数对象的参数。
这跟

function add(a,b)
{
    
return a+b;
}

 


效果是一样的。

但如果用alert(add);观察的话,会发现二者的不同
使用构造函数Function创建的函数是

function anonymous(a,b) {
    
return a+b;
}


可以看到,这里函数对象的名字和函数名是不一样的,它使用了默认的名字。
但是anonymous是不可用的。

进一步进行研究,用下面的代码来构造一个函数

add2=function add(a,b){
    
return a+b;
}
alert(add2(
13,24));



运行结果如预期为37。
那么此时add2函数是什么样的呢?用alert(add2);观察看到

function add(a,b){
    
return a+b;
}


可见,由这种方法构造出的函数对象名和函数名也是不同的。
但此时add也是可用的。

出于好奇,我测试了如下代码

add2=function anonymous(a,b) {
    
return a+b;
}
alert(add2(
13,24));


发现竟然也显示37,这样Function构造函数对象过程就比较清晰了。

 

6.自己定义的类
多数情况下自定义类的方法是使用构造函数

 

function Class(prop1,prop2,......)
{
    
this.prop1=prop1;
    
this.prop2=prop2;
    
this.prop3=prop3;
    ......
}
var obj=new Class(prop1,prop2,......);



这样就定义了一个类Class并创建了它的一个实例对象obj

由这里可以看出,内置对象如Array 肯定在某处存在着其构造函数的定义,只不过js程序的写者无法看到。

如果基于5所述函数对象的思想,为这个类定义方法(成员函数)跟为它定义属性没什么区别。
可以在构造函数中为它定义,也可以把预先写好的函数赋值给它,或者new Function构造。

function Class(prop1,prop2,......)
{
    
this.prop1=prop1;
    
this.prop2=prop2;
    ......
    
this.meth1=new Function(......);
    
this.meth2=function meth2(......){......};
    
this.meth3=meth3;
}
function meth3(......)
{
    ......
}

 


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添加了属性,不妨一试:

document.newprop="haha~!";
alert(document.newprop);

8.继承
众所周知,js是没有类的继承机制的,但是可以模拟实现。
根据上文的讨论,javascript没有public和private的区别,所以继承就是把某个类的所有属性和方法都添加到一个新类中
实现继承可以有这样的做法:

 

function classA(......){......}
function classB(......){......}
var a=new classA(......);
var b=new classB(......);
for(p in b)a[p]=b[p];

这个时候 b就具有了classA和classB的

 

所有属性
如果把它放到构造函数中去 就实现了继承

function classA(......)
{
    
var b=new classB(......);
    
for(p in b)this[p]=b[p];
    ......
}
function classB(......){......}

这样多继承也很容易实现

function classA(......)
{
    
var b=new classB(......);
    
for(p in b)this[p]=b[p];
    
var c=new classB(......);
    
for(p in c)this[p]=c[p];
    ......
}
function classB(......){......}
function classC(......){......}

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种

function classA(......)
{
    
    
this.parent=classB;
    
this.parent(......);
    ......
}
function classB(......){......}

但是这会为classA添加一个额外的属性parent
如果不需要的话也可以把它去掉

function classA(......)
{
    
var empty;
    
this.parent=classB;
    
this.parent(......);
    
this.parent=empty;
    ......
}
function classB(......){......}


这样效果就和我前面写的方法完全一样了。

 

网上流传的歌词同步技术:【上一篇】
logic:iterate:【下一篇】
【相关文章】
  • 如何使用JavaScript进行可靠的继承调用
  • Javascript 编程语言概论
  • javaScript 对象大全
  • 用javascript操作xml (需要修改)
  • JavaScript logger: Lumberjack
  • 在JavaScript中调用WebService
  • javascript总结--div
  • javascript在静态页面上接受参数的方法
  • javascript总结--cookie篇
  • javascript escape/unescape编码的Java实现
  • 【随机文章】
  • .net XML引擎驱动事件概述(一)
  • Windows平台安装Bugzilla(下)
  • 一个强大的杀windows进程命令ntsd
  • MSSQL同时操作数据加锁问题
  • solaris10共享上网
  • J2ME入门-(1)J2ME概述
  • Eclipse下Hibernate的开发(一)入门实例
  • JAVA与正则表达式
  • WPF实例学习(A-02)
  • QQ 2006 正式版协议变动情况分析
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.