Prototype1.5.1源代码解读分析-4

  1. 云栖社区>
  2. 博客>
  3. 正文

Prototype1.5.1源代码解读分析-4

技术小牛人 2017-11-22 09:53:00 浏览623
展开阅读全文
< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd>
Class源代码

下面是prototype框架源代码的第二段代码:

var Class = {

  create: function() {

    return function() {

      this.initialize.apply(this, arguments);

    }

  }

}

语法

什么是函数?函数(function)是一个可执行的javascript代码段,有javascript程序定义或由javascript实现预定义。虽然函数只被定义一次,但是javascript程序却可以多次执行或调用它。javascript的函数带有实际参数或者形式参数,用于指定这个函数执行计算要使用的一个或多个值,而且它还能返回一个值,以表示计算结果。javascript语言提供了许多预定义函数,如Math.sin(),它用于计算角的正弦值。

函数的实际参数:Arguments对象。在一个函数体内,标识符arguments具有特殊含义。它是调用对象的一个特殊属性,用来引用Arguments对象。Arguments对象就像数组,可以按照数字获取传递给函数的参数值。但它并非真正的Array对象。Arguments对象也定义了callee属性。尽管定义javascript函数时有固定数目的命名参数,但当调用这个函数时,传递给他的参数数目却可以是任意的。数组arguments[]允许完全地存取那些实际参数值,即使某些参数还没有被命名。假定你定义了一个函数f,要传递给他一个实际参数x,如果你用两个实际参数来调用这个函数,那么在函数体内,用形式参数名x或者arguments[0]可以存取第一个实际参数。而第二个实际参数只能通过arguments[1]来存取。而且和所有数组一样,arguments具有length属性,用于说明他所含有的元素个数。因此,在函数f的主体内,如果调用时使用的是两个实际参数,那么arguments.length的值是2.在这里,我们多次用到了“arguments数组”,这种说法是不准确的。请记住,arguments并非真正的数组,他是一个Arguments对象。

Arguments对象有一个非同寻常的特性。当函数具有命名了的参数时,Arguments对象的数组元素是存放函数参数的局部变量的同义词。arguments[]数组和命名了的参数不过是引用同一变量的两种不同方法。用参数名改变一个参数的值同时会改变通过arguments[]数组获得的值。通过arguments[]数组改变参数的值同样会改变用参数名获得的参数值。

ECMAScript v3给所有函数定义了两个方法call()和apply()。使用这两个方法可以像调用其他对象的方法一样调用函数。call()和apply()都是要调用的函数的对象,在函数体内这一参数是关键字this的值。call()的剩余参数是传递给要调用的函数的值。例如,要把两个数字传递给函数f(),并将他作为对象o的方法调用,可以用如下代码:

f.call(o,1,2);

apply()方法和call()方法相似,只不过要传递给函数的参数是由数组指定的。

javascript有对象和类的概念,但是没有内建继承的概念。我们可以通过构造函数来实现类似与内建继承的功能。在构造函数中,设置为this的属性的任何东西随后都可以作为对象的一个成员来使用。构造函数有两个特性:他有new运算符调用;传递给他的是一个对新创建的空对象的引用,将该引用作为关键字this的值,而且他还要对新创建的对象进行适当的初始化。

代码解析及其使用方法

Class是一个全局对象,他的唯一方法就是create,作用是返回一个函数,类似于ruby的类。prototype通过一个全局对象Class从形式上将函数和类区别开来。Class.create()仅仅是返回一个空类,而且它会默认为这个类是具有initialize方法的,所以要使用这个类,至少需要有一个构造函数,这就需要使用到类的继承。(作者注----这样解释可能有点难以理解哦,本人水平不高,只领悟到这一层次。)

示例:

var Animal = Class.create();

Animal.prototype = {

   initialize: function(name, sound) {

     this.name   = name;

     this.sound = sound;

   },

   speak: function() {

     alert(name + " says: " + sound + "!");

   }

};

var snake = new Animal("Ringneck", "hissssssssss");

snake.speak();

// -> alerts "Ringneck says: hissssssssss!"

var Dog = Class.create();

Dog.prototype = Object.extend(new Animal(), {

   initialize: function(name) {

     this.name   = name;

     this.sound = "woof";

   }  

});

var fido = new Dog("Fido");

fido.speak();

// -> alerts "Fido says: woof!"

本文转自 netcorner 博客园博客,原文链接: http://www.cnblogs.com/netcorner/archive/2007/08/16/2912304.html ,如需转载请自行联系原作者

网友评论

登录后评论
0/500
评论