Javascript的匿名函数和匿名类,以及原生类

这几天回头玩了一下Javascript,总结一下:

1.关于匿名类

var class1={p1:value1,p2:value2};

这个也可以写成

var class1={};

class1.p1=value1;

class1.p2=value2;

首先所有的匿名类都是继承与Object核心对象的,var class1={} 意味着实例化了一个Object对象,它拥有Object对象的原生属性和原生方法。

但是你不能为匿名类添加原生方法,例如这样写是错误的:

class1.prototype.func1=function(){};

你也不能尝试用new() 方法来构造一个新的与class1有相同的属性的新对象,因为它已经实例化了。以下写法也是错的:

var classB=new classA();

这是无法构造的,

准确的说,匿名类实际上是继承与Object的某一个半实例,相当于C#中的静态类。你可以为他添加方法和属性

例如:

class1.func1=function(){}

调用的时候就这样:

class1.func1(); 酷似C#中的静态类

但是你可以为Object添加原生函数,这样你的匿名类(实际上是所有的类)都有这个方法

例如:

var class1={};

class1.p1=value1;

class1.p2=value2;

Object.prototype.func1=function(){ alert(“1″) };

class1.func1();

是没有问题的,但是这样一来,所有的实例化对象都有了func1()方法。实际应用中应该避免给Object类添加原生方法。

2.关于匿名函数

先说说关于Javascript的函数:

可以这样说,JavaScript中一切皆是对象,function自然不例外,function可以作为函数,类,也可以当成一个被函数对象返回

看下面的例子:

function a()
{

alert(“Hello Febird!”);

this.aa=”aa”;
this.show=function ()
{
alert(this.aa);
};

this.sayHello=function()

{

return function() {alert(“hello”); } ;

};
}

var aaa=new a();
aaa.show();

aaa.sayHello();

其中最外面的一个function是定义了一个类 a ,他有属性aa,方法show(),sayHello();这两个都是匿名函数,而sayHello中的function便是函数作为一个返回值的例子。

实际上可以这样想,匿名函数就是一块没有命名的代码块,当你把他赋值给别的变量的时候,那么那个变量就是一个函数,准确的说那是一个函数指针^_^。

在Javasript中,匿名函数是很有特点的东西了,也是非常有用,也是有些难以理解的。

比如在写Ajax引用的时候,如果不依靠别的JSF,自己写一个通用的Ajax话,一般这样写:

var xhr=new XMLHttpRequest(); //已经封装,可以适应不同的浏览器;

function DoAjax ()

{

xhr.onreadystatechange=processFunction;

xhr.open(“GET”,url,true);

xhr.send(null);

}

function processFunction()

{

//do something with XMLHttpRequest;

if(xhr.readState!=4||xhr.status!=200) return false;

alert(xhr.responseText);

}

在一般的Ajax引用中,也许只要一个XMLHttpRequest对象,而且onreadystatechange的处理函数必须没有参数,有参数就出错,

所以,一般经常会写一个全局变量XMLHttpRequest,再在processFunction中用到这个全局变量,但是如果我要建立几个

XMLHttpRequest的并发连接怎么办呢?这个就不能用全局变量了,但是处理函数又不能有参数,怎么搞,可以这样:

function DoAjax ()

{

var xhr=new XMLHttpRequest();

xhr.onreadystatechange=processFunction(xhr);

xhr.open(“GET”,url,true);

xhr.send(null);

}

function processFunction(_xhr)

{

return function()

{

//do something with XMLHttpRequest;

if(_xhr.readState!=4||_xhr.status!=200) return false;

alert(_xhr.responseText);

};

}

怎么理解?虽然processFunction函数有参数,但是它返回的函数没有参数!而这两个函数之间是怎么进行的值传递呢?

这里不妨引用一句话:

“为了函数能够正确的执行,需要被函数使用的,词法作用域中的,非全局数据,
存在于函数的闭包之中。”

可以这样理解:

当我们把processFunction()返回的函数,在processFunction之外使用的时候,依然要记得自己被定义时的上级作用域中的各种变量的值。这些需
要被记住的值,就是“闭包”。

3.关于原生对象

原生,即prototype,他提供我们了扩展、改造原有对象的方法。例如我们可以为已知对象,包括JavaScript的核心对象Array,Number,Math,Object,Boolean等和自定义类添加方法或者属性。

例如:

Number.prototype.toHexString = function () {

return this.toString(16);

};

var num=10

alert(num.toHexString());

输出A;

你可以为Object对象添加方法,这样,以后任意一个对象都有这个方法,因为其它对象都是从Object继承而来的。

你也可以再造现有函数

Function.prototype.toString = function () {

return “Function Locked”;

};

4.关于This

在JavaScript中,并没有严格的面向对象概念,自然也没有类的构造函数这样的概念。var o=new Obj();这样的语法,看起来似乎和Java/C++相当类似,但是他背后的执行过程是不同的。首先,解释器会new一个空的Object对象。然后将这个空的Object,作
为隐藏的参数传递给function Obj()。在Obj函数中访问到的this,其实就是这个传入的空的Object 对象。所以,如果这个Object,

并非为空,这就是所谓:“this关键字关联于执行时的作用域”的含义。

如果你想把一个函数作为“构造函数”,那么就不要在函数的最后加上return语句。因为如果没有return语句,new算符返回的就是

那个被操作过以后的this。一旦你通过return返回了别的东西,这个this就被废弃掉了。对于函数的调用者来说,就会相当的困惑。

  1. 我的网络


  2. 标签云

  3. 推荐服务

  4. 分类目录


  5. 最近文章

    1. 2011年度小结
    2. 美国主机与翻墙
    3. Archos101平板安装openAOS系统
    4. 折腾能力下降
    5. 新浪微博与腾讯QQ正面竞争已经展开
    6. Google Talk 和 Google Voice 的终极整合
    7. “无法访问Windows Installer服务”解决方法
    8. 跨平台的移动应用开发框架-PhoneGap
    9. 七月
    10. 在电脑上K歌的设置
    11. 中国通货膨胀的原因
    12. 关于家族字辈
    13. 15款免费云存储服务
    14. 基于PHP的开源在线OA软件 Feng Office
    15. 在WordPress中展示Facebook相册
    16. MusicBrainz Picard–MP3自动标签匹配工具
    17. 荧光灯为啥不能直接装在普通调光台灯上
    18. 打电话时”已关机”和“无法接通”的区别
    19. Ubuntu下使用WindowsMediaCenter遥控器控制XBMC
    20. 非常酷的开源Media Center-XBMC
  6. 最近评论

    1. ninee's avatarninee
      不错,有收获,有计划!
    2. febird's avatarfebird
      你说的是 Virtual-WiFi ? 只要是通过Windows的“共享网络连接"功能的,作为网关的那块网卡就支持NAT功能,也就起到了路由器的作用。 至于说一块网卡怎么能生成两个接口,那是网卡的一种模式,可以理解为AP-STA模式。
    3. jk's avatarjk
      问一下啊。。。W7下系统就能自动有一个虚拟网卡。通过它可以共享网络。那么这个虚拟网卡和物理网卡是怎么连的?我觉得是NAT吧。问一下。还有我G+上加你了。
    4. febird's avatarfebird
      哥的地盘,要开始实名制了。
    5. 就不告诉你's avatar就不告诉你
      公子啊,第5条是亮点啊~
    6. 龙龙Fred's avatar龙龙Fred
      那我一定要试一试
    7. NoAnyLove's avatarNoAnyLove
      对,GoAgnet是个不错的解决方案,不仅免费,而且速度也快,基本上可以达到你的带宽的全速(但是好像不能超过500 KB/s ,话说,国内个人用的带宽还很少有能达到这个速度的),比许多收费的SSH和VPN还要快。用于看Youtube绝对死最好的选择,访问一些美国网站也不是问题
    8. a nerd's avatara nerd
      GoAgent不就解决了