`
javasee
  • 浏览: 993215 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

元语言基础技术之:在JS中如何自由地创建函数

阅读更多

在前面讲元语言

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

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

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

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

---------

// 直接量对象声明

obj = {... }

 

// 使用基于原型继承的方法来构造对象

function MyObject() {

}

MyObject.prototype = {

  constructor: MyObject,

  value: ...

}

obj = new MyObject();

 

// 使用基于属性抄写的方法来构造对象

function MyObject2 {

  this.constructor = arguments.callee;

  this.value = ...

}

obj = new MyObject2();

---------

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

---------

// 声明函数直接量

function X() {

}

 

 

// 创建函数

X = new Function();

---------

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

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

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

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

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

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

---------

f = new Function(....);

---------

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

---------

f = Function.apply(this, args);

---------

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

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

---------

function ArrayFactory() {

  .....  //<--任意的预处理

  return Function.apply(null, '...........');  // <---可任意组织的函数代码
}

 

X = new ArrayFactory();// 得到函数

x = new X(); //<--用作构造器,或作为函数直接执行

---------

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

---------

void Function = function(F) {

  return function() {
    ...   //<--预处理arguments参数,或重新构造参数数组

    return F.apply(this, arguments);

  }

}(Function);

 

X = new Function(..................);  // 得到函数

x = new X();   //<--用作构造器,或作为函数直接执行

---------

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

分享到:
评论

相关推荐

    Eloquent JavaScript 2e(标注版)

    本书旨在通过实践的方式教授读者现代编程的基础知识,并特别关注JavaScript语言。它不仅仅是一本教科书,还是一部关于编程思维的艺术作品。 **版权信息**: 本书受Creative Commons Attribution-NonCommercial许可...

    JS内测题(1).zip

    JavaScript,简称JS,是一种广泛应用于Web开发的轻量级脚本语言,主要在客户端运行,为网页添加交互性。此“JS内测题(1).zip”文件包含的A231 JS内测题,很可能是针对JavaScript编程技能的一系列测试题目,用于评估...

    The Joy of JavaScript-2021.pdf

    在JavaScript中,每当一个函数被创建时,就会形成一个闭包。闭包允许函数访问并修改在其外部作用域中定义的变量。 ```javascript function outer() { let x = 10; function inner() { console.log(x); // 10 }...

    前端项目-ring.js.zip

    多继承在JavaScript中的实现通常涉及元编程技术,如使用原型、构造函数或者使用自定义的继承机制。Ring.js可能采用了类似的方法,通过组合多个对象的特性来创建一个新的类。这样的设计使得开发者可以在不改变原有类...

    freedom:基于javascript的示例应用

    在JavaScript的世界里,"Freedom"可能是指开发者可以自由地使用各种库、框架和工具来构建动态、交互式的网页。这可能是一个教学项目,用于帮助初学者理解如何在实际项目中运用JavaScript,或者展示如何利用...

    自由岭峰行业留言系统1.94.2.F

    【自由岭峰行业留言系统1.94.2.F】是一款专为单位用户设计的高效留言管理系统,基于经典的ASP(Active Server Pages)技术构建。ASP是微软开发的一种服务器端脚本环境,允许开发者创建动态、交互式的Web应用程序。在...

    php程序员菜鸟成长手记——php入门教程

    用在查询中的运算符和函数 - **运算符**:=、!=、、IN、LIKE等。 - **函数**:COUNT()、SUM()、AVG()、MAX()、MIN()等。 #### 七、Web软件开发 ##### 1. 用户需求 - **需求分析**:明确用户的具体需求,如功能...

    java视频全套教程.txt

    根据提供的文件信息,以下是从标题、描述以及部分标签中提炼出的相关知识点: ### Java SE基础 Java SE(Standard Edition)是Java技术的核心部分,适用于桌面应用程序的开发。本部分覆盖了大约300集的内容,从...

    动态自定义类型.rar

    在易语言中,动态类型和自定义类型相结合,使得开发者能够更加自由地构建和操作数据结构,从而实现更加复杂和高效的应用。如果你对这个主题感兴趣,深入研究压缩包内的源码将会是提升技能的好途径。

    基于PHP的Concrete5 CMS 国外的php网站管理系统.zip

    9. **SEO友好**:Concrete5对搜索引擎优化(SEO)进行了优化,允许用户轻松添加元标签、URL重写等,以提高网站在搜索结果中的排名。 10. **安装与更新**:安装Concrete5的过程相对简单,只需按照官方文档的步骤操作...

    基于PHP的好买卖PHP中文商城网店系统 开源版.zip

    1. **PHP Web开发**:了解PHP的基本语法、函数、类和对象、错误处理、会话管理等,是使用此系统前的基础。开发者需要熟悉PHP的MVC(模型-视图-控制器)架构模式,以便更好地理解和修改源代码。 2. **MySQL数据库...

    2021-2022计算机二级等级考试试题及答案No.10879.docx

    - 选项 A 的描述是不正确的,因为 JavaScript 是一种非常流行的编程语言,在 Web 开发中应用广泛。因此正确答案为 A “JavaScript是一种脚本语言,所以它一般没人用”。 ### 21. 内存管理 **知识点:** - **内存...

    A look at the design of lua.pdf

    通过上述分析,我们可以看出 Lua 之所以能够在众多脚本语言中脱颖而出,主要是因为它采用了一种高度模块化的设计理念,这种理念既保持了语言的简洁性,又赋予了开发者极大的自由度来构建自己的抽象层次。此外,Lua ...

    带小图标jQuery图片切换特效.zip

    在本项目"带小图标jQuery图片切换特效.zip"中,我们关注的是一个基于HTML5、jQuery、JavaScript和CSS实现的前端交互效果。...通过深入理解这些技术,你可以自由地调整和扩展这个特效,以满足不同项目的需求。

    WordPress开发手册-03311730.pdf

    通过本手册的学习,您可以全面地掌握 WordPress 主题和插件的开发技术,从基础概念到高级应用,从主题开发到插件开发,再到 REST API 的扩展,每一个环节都力求详尽。无论是初学者还是有经验的开发者,都能从中获得...

    java基础学习词汇

    在Java反射API中,可以动态地调用类的方法。 #### Iterator (迭代器) 迭代器是一个用于遍历集合的接口。Java中的迭代器允许逐个访问集合中的元素,而无需暴露集合的具体实现。 #### Legal (合法的) 虽然“legal...

    2021-2022计算机二级等级考试试题及答案No.17109.docx

    - **描述**:在创建自由表时,字段命名的最大长度限制。 - **解答**:自由表字段名的最大长度为10个字符(选项B正确)。 #### 5. Excel 2003中输入日期的方法 - **知识点**:在Excel中输入日期的具体快捷键。 - **...

    COM技术内幕 组件对象模型

    在"COM技术内幕"这本书中,作者深入探讨了COM技术的各个方面,旨在帮助读者理解并掌握这一关键技术。以下是关于COM的一些关键知识点: 1. **对象和接口**:COM对象是实现了特定接口的实例,接口定义了对象的方法和...

    html5 3D画册

    在这个3D画册中,Canvas可能是用于创建3D场景的基础,通过JavaScript的绘图函数来描绘和变换画册的各个层面。 2. **WebGL**:WebGL是基于OpenGL标准的JavaScript API,它使得浏览器可以直接支持3D图形渲染,无需...

Global site tag (gtag.js) - Google Analytics