一掬细纱,随风而逝

博客园 首页 新随笔 联系 订阅 管理

在前面讲元语言

http://blog.csdn.net/aimingoo/archive/2008/07/25/2707504.aspx

http://blog.csdn.net/aimingoo/archive/2008/07/25/2709638.aspx

的过程中,有些技术细节就忽略了。其中之一,就是这个创建函数的方法。这里开个小主题来讲讲。

 

在JS里面,我们可以用任意方法来构建对象,包括直接量和构造器。在使用构造器时,也可以有基于原型和基于属性抄写两种方法(以及这两种方法混用)。下面的例子简要地说明这些对象的构造方法:

 

  1. ---------   
  2.   
  3. // 直接量对象声明   
  4.   
  5. obj = {... }   
  6.   
  7.     
  8.   
  9. // 使用基于原型继承的方法来构造对象   
  10.   
  11. function MyObject() {   
  12.   
  13. }   
  14.   
  15. MyObject.prototype = {   
  16.   
  17.   constructor: MyObject,   
  18.   
  19.   value: ...   
  20.   
  21. }   
  22.   
  23. obj = new MyObject();   
  24.   
  25.     
  26.   
  27. // 使用基于属性抄写的方法来构造对象   
  28.   
  29. function MyObject2 {   
  30.   
  31.   this.constructor = arguments.callee;   
  32.   
  33.   this.value = ...   
  34.   
  35. }   
  36.   
  37. obj = new MyObject2();   
  38.   
  39. ---------<PRE></PRE>  

 

 

对象创生的方法很多也很灵活,而且灵活应用,还能产生更加复杂的技术方法。但作为JS另外一半的“函数”,它的创生方法就不那么方便了。它只有两种方法:

  1. ---------   
  2.   
  3. // 声明函数直接量   
  4.   
  5. function X() {   
  6.   
  7. }   
  8.   
  9.     
  10.   
  11.     
  12.   
  13. // 创建函数   
  14.   
  15. X = new Function();   
  16.   
  17. ---------<PRE></PRE>  

 

 

注意这里的创建函数,在JS中,有且仅有这样一种语法能“动态地”创建出一个函数来。然而,如果我们试图对创建函数的过

程加以控制,那么就极为不便了——我们没有什么办法来“得到”一个函数。这个问题,我曾经在另外一篇博客文章中讨论过:

http://blog.csdn.net/aimingoo/archive/2006/03/25/638092.aspx

 

简而言之,我就是想要实现一个构造器——类似于Function。这个构造器能像创建对象一样,创建出函数了。这与元语言系统之间的关系在于:有了“能创建函数的函数”,就等于有了“元函数”。而“元函数+元数据(元类、元对象、基元类型)”就构成了一个完整的元语言系统——其中“基元类型”也就是值类型。

 

那么,如何构造出一个函数呢?

 

其实这个技巧与Function的使用有关。大家都知道Function()的用法是这样:

  1. ---------   
  2.   
  3. f = new Function(....);   
  4.   
  5. ---------<PRE></PRE>  

 

但可能没几个人想过,Function也可以象下面这样使用:

 

  1. ---------   
  2.   
  3. f = Function.apply(this, args);   
  4.   
  5. ---------<PRE></PRE>  

 

O!居然可以这样吗?哈哈,是的。而且,这样一来,我们可以自由地处理函数的创建参数、以及写自己的“元函数”。

 

简单地说,我们可以这样写:

 

  1. ---------   
  2.   
  3. function ArrayFactory() {   
  4.   
  5.   .....  //<--任意的预处理   
  6.   
  7.   return Function.apply(null'...........');  // <---可任意组织的函数代码   
  8. }   
  9.   
  10.     
  11.   
  12. X = new ArrayFactory();// 得到函数   
  13.   
  14. x = new X(); //<--用作构造器,或作为函数直接执行   
  15.   
  16. ---------<PRE></PRE>  

 

 

我们也可覆盖系统的Function函数,以使得它对参数做一些预处理:

  1. ---------   
  2.   
  3. void Function = function(F) {   
  4.   
  5.   return function() {   
  6.     ...   //<--预处理arguments参数,或重新构造参数数组   
  7.   
  8.     return F.apply(this, arguments);   
  9.   
  10.   }   
  11.   
  12. }(Function);   
  13.   
  14.     
  15.   
  16. X = new Function(..................);  // 得到函数   
  17.   
  18. x = new X();   //<--用作构造器,或作为函数直接执行   
  19.   
  20. ---------<PRE></PRE>  

 

 

由于上述性质,我们可以构建任意复杂的“函数+对象”系统。而更深层面的意义在于:“函数+对象”实际上映射了“算法+数据结构”两个方面的性质,因此,从JS的元语言系统开始,我们可以构建任意复杂的语言,或者任意复杂的执行系统。

posted on 2008-10-09 00:50  杰灵之地  阅读(180)  评论(0)    收藏  举报