Javascript匿名类

Javascript匿名类1 关于匿名类 nbsp nbsp nbsp var nbsp class1 p1 value1 p2 value2 nbsp nbsp nbsp 这个也可以写成 nbsp nbsp nbsp varclass1 nbsp nbsp nbsp nbsp class1 p1 value1 nbsp nbsp nbsp nbsp class1 p2 value2 首先所有的匿名类都是继承与 Object 核心对象的 varclass1 意味着实例化了一个 Object 对象 它

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就被废弃掉了。对于函数的调用者来说,就会相当的困惑。








































































































































































































版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218972.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午11:05
下一篇 2026年3月17日 下午11:05


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号