Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 网站建设 > 网页制作 > 关于javascript实现类的探讨
【标  题】:关于javascript实现类的探讨
【关键字】:javascript
【来  源】:http://blog.csdn.net/binwind/archive/2006/08/04/1020464.aspx

关于javascript实现类的探讨

Your Ad Here 不少人对javascript实现类这一点上有些疑惑。因为本来一个很普通的function怎么会变成了一个类的构造函数。在这里我想根据我这几天的研究。谈谈javascript是怎么样实现class的。
讲解这个话题之前我们必须先了解一些背景知识。
首先我们必须了解一点在javascript中。对象是使用类似于Dictionary的机制来实现.请看下面代码 
var Obj = new Object();
Obj[
"Age"= 32;
Obj.Name 
= "Hello";
alert(
"Age: "+ Obj.Age + "Name:"+ Obj["Name"]);


所以我们可以看出实际上在javascript中就每一个对象类似于Dictonary。对该对象的属性进行访问。也就是从该Dictonary中读取也就是说Obj.Age实际上也就是同Obj["Age"]是同样意义的。

然后我们需要理解借用函数这一个概念。还是先看看代码

function Speak()
{
    alert(
"Age: "+ this.Age+ "Name:"+ this.Name);
}




var Obj = new Object();
Obj.Age 
= 32;
Obj.Name 
= "Hello";

Speak.call(Obj);

在调用了函数Speak的call之后。函数中的全部的this都会变成call的第一个参数。而如果代码如下:
function Speak()
{
    alert(
"Age: "+ this.Age+ "Name:"+ this.Name);
}




var Obj = new Object();
Obj.Age 
= 32;
Obj.Say 
= Speak;

Obj.Say();

这个时候Speak函数中的this也会变成Obj这同Seapk.call(Obj)是等价的


了解了这两点后。我们就可以看看new之后发生了一些什么.

function ClassA()
{
    
this.Name = "Class A";
}

ClassA.prototype.Speak 
= function()
{
    alert(
this.Name);
}

    
    
function SimulateNew(constructor)
{
    
var obj = new Object();
    
    
for(var s in constructor.prototype)//1
    {
        obj[s] 
= constructor.prototype[s];
    }


    constructor.call(obj);
//2
    //1,2的次序在某些情况下又影响.new应该是按照先1后2来进行的
    return obj;
}


var a = new ClassA();
a.Speak();

var anotherA = SimulateNew(ClassA);
anotherA.Speak();
所以我们可以看出从本质上来所.new在幕后做得.也就是和SimulateNew函数做得是类似的(当然还要处理一些注册等的工作用来处理instanceof等reflection).还值得一提的是在每一个函数被声称后都会自动加上一个prototype的属性
function NoramlFunction()
{
    
//do anything...    
}


alert(NormalFunction.prototype);

可以看到prototype是自动添加上的.相当于:
function NoramlFunction()
{
    
//do anything...    
}

//NormalFunction.prototype = new Object; 这一步在生成function对象的时候已经由后台自动实现了
alert(NormalFunction.prototype);


理解了这一点后.我们可以很好的理解javascript的继承等等概念
关于javascript的继承有兴趣的可以看一下的帖子:
http://birdshome.cnblogs.com/archive/2005/01/28/95933.html
关于javascript面向对象更详细的解释
http://mckoss.com/jscript/object.htm

注:第二个链接的私有成员的成立本人持保留意见.这个是一个很tricky的办法.而且在prototype定义的函数中无法访问私有成员而且私有成员不能通过this访问.这违背了private的本质
所以应该按照Professional.JavaScript.For.Web.Developers一书88页(英文原版Apr.2005)中说的使用命名来区分用途

电骡协议规范(四):客户端到客户端的TCP连接:【上一篇】
Atlas 学习之004:“UpdatePanel ”和“UpdateProgress ”使更新数据呈现动画效果:【下一篇】
【相关文章】
  • JavaScript的分页跳转函数
  • [JavaScript]自定义Title的显示方式
  • 将内容复制到剪贴板 javascript 代码
  • 使用javascript的日期函数
  • 理解JavaScript的OOP编程
  • 一个验证身份证号码的javascript函数
  • Javascript 函数: CTRL+回车 提交表单 By shawl.qiu
  • decode javascript.encode using java
  • Javascript实现连续滚动的跑马灯,可上下左右滚动
  • [HOW TO] 如何在Mozilla Gecko 用Javascript加载XSL
  • 【随机文章】
  • c++ primer(第四版)学习札记 9-24
  • Sunny:tpoint2.h
  • 我的MSN与你的不一样
  • O/R Mapping再乱弹
  • 端口重定向问题
  • 2004年十大计算机病毒分析与防治(3)
  • ADO+ 引导数据种类的演变(转自 ms 二)
  • Jakata Poi HSSF:纯Java的Excel解决方案
  • 《天堂2》法师青狼外套总整理
  • 《程序员》专访 SOHU研发团队畅谈开发经验
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.