您现在的位置: 网页制作教程网 >> 网页特效 >> Javascript 教程 >> 正文

悟透JavaScript

作者:Jeffrey …

来源:ASPCool

热度:

2008-2-27 10:04:10


  
   然而,比静态对象语言更神奇的是,我们可以随时给原型对象动态添加新的属性和方法,从而动态地扩展基类的功能特性。这在静态对象语言中是很难想象的。我们来看下面的代码:
以下是引用片段:
function Person(name)
   {
   this.name = name;
   };
  
   Person.prototype.SayHello = function() //建立对象前定义的方法
   {
   alert("Hello, I'm " + this.name);
   };
  
   var BillGates = new Person("Bill Gates"); //建立对象
  
   BillGates.SayHello();
  
   Person.prototype.Retire = function() //建立对象后再动态扩展原型的方法
   {
   alert("Poor " + this.name + ", bye bye!");
   };
BillGates.Retire(); //动态扩展的方法即可被先前建立的对象立即调用
   阿弥佗佛,原型继承竟然可以玩出有这样的法术!
  
  原型扩展
  
   想必君的悟性极高,可能你会这样想:如果在JavaScript内置的那些如Object和Function等函数的prototype上添加些新的方法和属性,是不是就能扩展JavaScript的功能呢?
  
   那么,恭喜你,你得到了!
  
   在AJAX技术迅猛发展的今天,许多成功的AJAX项目的JavaScript运行库都大量扩展了内置函数的prototype功能。比如微软的 ASP.NET AJAX,就给这些内置函数及其prototype添加了大量的新特性,从而增强了JavaScript的功能。
  
   我们来看一段摘自MicrosoftAjax.debug.js中的代码:
  
  String.prototype.trim = function String$trim() {
   if (arguments.length !== 0) throw Error.parameterCount();
   return this.replace(/^\s+|\s+$/g, '');
  }
   这段代码就是给内置String函数的prototype扩展了一个trim方法,于是所有的String类对象都有了trim方法了。有了这个扩展,今后要去除字符串两段的空白,就不用再分别处理了,因为任何字符串都有了这个扩展功能,只要调用即可,真的很方便。
  
   当然,几乎很少有人去给Object的prototype添加方法,因为那会影响到所有的对象,除非在你的架构中这种方法的确是所有对象都需要的。
  
   前两年,微软在设计AJAX类库的初期,用了一种被称为“闭包”(closure)的技术来模拟“类”。其大致模型如下:
以下是引用片段:
function Person(firstName, lastName, age)
   {
   //私有变量:
   var _firstName = firstName;
   var _lastName = lastName;
  
   //公共变量:
   this.age = age;
  
   //方法:
   this.getName = function()
   {
   return(firstName + " " + lastName);
   };
   this.SayHello = function()
   {
   alert("Hello, I'm " + firstName + " " + lastName);
   };
   };
  
   var BillGates = new Person("Bill", "Gates", 53);
   var SteveJobs = new Person("Steve", "Jobs", 53);
  
   BillGates.SayHello();
   SteveJobs.SayHello();
   alert(BillGates.getName() + " " + BillGates.age);
   alert(BillGates.firstName); //这里不能访问到私有变量
很显然,这种模型的类描述特别象C#语言的描述形式,在一个构造函数里依次定义了私有成员、公共属性和可用的方法,显得非常优雅嘛。特别是“闭包”机制可以模拟对私有成员的保护机制,做得非常漂亮。
  
   所谓的“闭包”,就是在构造函数体内定义另外的函数作为目标对象的方法函数,而这个对象的方法函数反过来引用外层外层函数体中的临时变量。这使得只要目标对象在生存期内始终能保持其方法,就能间接保持原构造函数体当时用到的临时变量值。尽管最开始的构造函数调用已经结束,临时变量的名称也都消失了,但在目标对象的方法内却始终能引用到该变量的值,而且该值只能通这种方法来访问。即使再次调用相同的构造函数,但只会生成新对象和方法,新的临时变量只是对应新的值,和上次那次调用的是各自独立的。的确很巧妙!

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] 下一页


我来说两句:

1分 2分 3分 4分 5分
姓名: *


* 请各位网友遵纪守法并注意语言文明。
网站简介 | 联系方式 | 意见建议 | 版权说明
Copyright © 2007 All rights reserved
滇ICP备06006992号