在前面讲元语言
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的元语言系统开始,我们可以构建任意复杂的语言,或者任意复杂的执行系统。
分享到:
相关推荐
本书旨在通过实践的方式教授读者现代编程的基础知识,并特别关注JavaScript语言。它不仅仅是一本教科书,还是一部关于编程思维的艺术作品。 **版权信息**: 本书受Creative Commons Attribution-NonCommercial许可...
JavaScript,简称JS,是一种广泛应用于Web开发的轻量级脚本语言,主要在客户端运行,为网页添加交互性。此“JS内测题(1).zip”文件包含的A231 JS内测题,很可能是针对JavaScript编程技能的一系列测试题目,用于评估...
在JavaScript中,每当一个函数被创建时,就会形成一个闭包。闭包允许函数访问并修改在其外部作用域中定义的变量。 ```javascript function outer() { let x = 10; function inner() { console.log(x); // 10 }...
多继承在JavaScript中的实现通常涉及元编程技术,如使用原型、构造函数或者使用自定义的继承机制。Ring.js可能采用了类似的方法,通过组合多个对象的特性来创建一个新的类。这样的设计使得开发者可以在不改变原有类...
在JavaScript的世界里,"Freedom"可能是指开发者可以自由地使用各种库、框架和工具来构建动态、交互式的网页。这可能是一个教学项目,用于帮助初学者理解如何在实际项目中运用JavaScript,或者展示如何利用...
【自由岭峰行业留言系统1.94.2.F】是一款专为单位用户设计的高效留言管理系统,基于经典的ASP(Active Server Pages)技术构建。ASP是微软开发的一种服务器端脚本环境,允许开发者创建动态、交互式的Web应用程序。在...
用在查询中的运算符和函数 - **运算符**:=、!=、、IN、LIKE等。 - **函数**:COUNT()、SUM()、AVG()、MAX()、MIN()等。 #### 七、Web软件开发 ##### 1. 用户需求 - **需求分析**:明确用户的具体需求,如功能...
根据提供的文件信息,以下是从标题、描述以及部分标签中提炼出的相关知识点: ### Java SE基础 Java SE(Standard Edition)是Java技术的核心部分,适用于桌面应用程序的开发。本部分覆盖了大约300集的内容,从...
在易语言中,动态类型和自定义类型相结合,使得开发者能够更加自由地构建和操作数据结构,从而实现更加复杂和高效的应用。如果你对这个主题感兴趣,深入研究压缩包内的源码将会是提升技能的好途径。
9. **SEO友好**:Concrete5对搜索引擎优化(SEO)进行了优化,允许用户轻松添加元标签、URL重写等,以提高网站在搜索结果中的排名。 10. **安装与更新**:安装Concrete5的过程相对简单,只需按照官方文档的步骤操作...
1. **PHP Web开发**:了解PHP的基本语法、函数、类和对象、错误处理、会话管理等,是使用此系统前的基础。开发者需要熟悉PHP的MVC(模型-视图-控制器)架构模式,以便更好地理解和修改源代码。 2. **MySQL数据库...
- 选项 A 的描述是不正确的,因为 JavaScript 是一种非常流行的编程语言,在 Web 开发中应用广泛。因此正确答案为 A “JavaScript是一种脚本语言,所以它一般没人用”。 ### 21. 内存管理 **知识点:** - **内存...
通过上述分析,我们可以看出 Lua 之所以能够在众多脚本语言中脱颖而出,主要是因为它采用了一种高度模块化的设计理念,这种理念既保持了语言的简洁性,又赋予了开发者极大的自由度来构建自己的抽象层次。此外,Lua ...
在本项目"带小图标jQuery图片切换特效.zip"中,我们关注的是一个基于HTML5、jQuery、JavaScript和CSS实现的前端交互效果。...通过深入理解这些技术,你可以自由地调整和扩展这个特效,以满足不同项目的需求。
通过本手册的学习,您可以全面地掌握 WordPress 主题和插件的开发技术,从基础概念到高级应用,从主题开发到插件开发,再到 REST API 的扩展,每一个环节都力求详尽。无论是初学者还是有经验的开发者,都能从中获得...
在Java反射API中,可以动态地调用类的方法。 #### Iterator (迭代器) 迭代器是一个用于遍历集合的接口。Java中的迭代器允许逐个访问集合中的元素,而无需暴露集合的具体实现。 #### Legal (合法的) 虽然“legal...
- **描述**:在创建自由表时,字段命名的最大长度限制。 - **解答**:自由表字段名的最大长度为10个字符(选项B正确)。 #### 5. Excel 2003中输入日期的方法 - **知识点**:在Excel中输入日期的具体快捷键。 - **...
在"COM技术内幕"这本书中,作者深入探讨了COM技术的各个方面,旨在帮助读者理解并掌握这一关键技术。以下是关于COM的一些关键知识点: 1. **对象和接口**:COM对象是实现了特定接口的实例,接口定义了对象的方法和...
在这个3D画册中,Canvas可能是用于创建3D场景的基础,通过JavaScript的绘图函数来描绘和变换画册的各个层面。 2. **WebGL**:WebGL是基于OpenGL标准的JavaScript API,它使得浏览器可以直接支持3D图形渲染,无需...