2022年JavaScript-C引擎嵌入开发指南 .pdf

上传人:Che****ry 文档编号:27189132 上传时间:2022-07-23 格式:PDF 页数:36 大小:475.62KB
返回 下载 相关 举报
2022年JavaScript-C引擎嵌入开发指南 .pdf_第1页
第1页 / 共36页
2022年JavaScript-C引擎嵌入开发指南 .pdf_第2页
第2页 / 共36页
点击查看更多>>
资源描述

《2022年JavaScript-C引擎嵌入开发指南 .pdf》由会员分享,可在线阅读,更多相关《2022年JavaScript-C引擎嵌入开发指南 .pdf(36页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、JavaScript-C 引擎嵌入开发指南http:/developer.mozilla.org/en/docs/JSAPI_Referencehttp:/www.nirvanastudio.org/javascript/javascript-c-engine-embedders-guide.htmlhttp:/developer.mozilla.org/cn/docs/SpiderMonkeyhttp:/developer.mozilla.org/cn/docs/DOMhttp:/www.mozilla.org/js/spidermonkey/http:/ftp.mozilla.org/pu

2、b/mozilla.org/js/http:/developer.mozilla.org/en/docs/JavaScript_C_Engine_Embedder%27s_Guidehttp:/lxr.mozilla.org/mozilla/source/js/srchttp:/developer.mozilla.org/en/docs/Category:SpiderMonkeyhttp:/lxr.mozilla.org/mozilla/source/js/JavaScript-C引擎概览 本文档提供了一个JavaScript (JS)引擎的C语言实现的概述,他介绍了你如何在你的应用程序中嵌入

3、脚本引擎 来让它们可以使用JS。有两大理由让你在应用程序中嵌入 JS 引擎:使用脚本来自动操作你的应用程序;同时使用 JS引擎和脚本无论何时都可以提供跨平台的功能并消除了应用程序解决方案对平台的依赖性。 受支持的 JavaScript版本 本 JS 引擎支持从 JS 1.0 版到 JS1.4。JS 1.3和更高版本符合 ECMAScript-262规范。JS 引擎解析、编译和执行包含JS语句和函数的脚本。这个引擎可以处理要用来执行脚本的JS 数据类型和对象内存分配,同时它可以清除垃圾回收内存中已经不需要的数据类型和对象。 你如何使用这个引擎? 通常,你将 JS 引擎作为一个共享的资源进行构建。

4、例如,在 Windows和 Windows NT上,这个引擎是一个DLL文件,在 Unix 上是一个共享库。然后你把你的应用程序和他连接, 同时嵌入式 JS引擎应用程序编程接口 (API)就可以在你的应用程序中调用了。JS 引擎的 API 提供了以下几种分类的函数: ?数据类型操作 ?运行时控制 ?类和对象创生的维护 ?函数和脚本执行 ?字符串处理 ?错误处理 ?安全性控制 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 36 页 - - - - - - - - - ?调

5、试支持 你在每个嵌入了 JS调用的应用程序中将会用到这些功能分类中的某些部分,象运行时控制和数据类型操作。例如,在你调用其他JS 功能之前,你必须通过调用 JS_NewRuntime函数来新建和初始化JS 引擎。其他功能分类,像安全控制,提供一些可选的特性,你可以根据需要在你的应用程序中使用它们。 这个引擎和应用程序有什么关系? 从概念上来讲,JS 引擎在你的系统上是一个共享资源。通过在你的应用程序中嵌入引擎 API 命令你可以向 JS 引擎传递处理的请求。这个引擎,反过来,处理你的请求,并把返回值或者状态信息返回给你的应用程序。图 1.1 描述了它们一般的关系: 图 1.1例如,假设你正在使

6、用 JS 引擎来使你的应用程序能通过JS 脚本自动运行, 同时假设你的应用程序运行一个脚本来对一个用户进行身份验证并且设置一个用户对这个应用程序的访问权限。 首先,你的应用程序可能新建一个代表用户的自定义 JS 对象,包括了用户的名字、ID、访问权限和一个可能的用户拥有权限在应用程序中使用的函数的列表。 在这个情况下,你的应用程序给JS 引擎发送的的第一个请求可能是对JS_NewObject的调用来新建一个自定义对象。当JS 引擎新建了这个对象,他返回一个指针给你的应用程序。你的应用程序可以再次调用JS 引擎来执行使用这个对象的脚本。例如,在建立了用户对象之后,你的应用程序会立刻给JS_Eva

7、luateScript传递一个脚本来立刻编译执行。那个脚本可以获得并验证用户信息,然后建立用户对其他应用程序特性的访问权限。 事实上,你的应用程序和JS 引擎之间的关系远比图1.1 中显示的要复杂的多。例如,它假设你已经为你的平台构建了JS 引擎。它还假设你的应用程序包含了jsapi.h还假设应用程序对引擎进行的第一个调用已经初始化了JS运行时。 当 JS 引擎接受到了一个初始化的请求时,他会为JS运行时分配内存。图1.2描述了这个过程: 图 1.2名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - -

8、 - - 第 2 页,共 36 页 - - - - - - - - - 这个运行时是一个内存空间, 在其中可以维护你的应用程序所使用的变量、对象和上下文。一个上下文是指,针对JS 引擎所使用的线程的脚本执行状态。每个同时存在的脚本或者线程都必须有它自己的上下文。一个单独的JS 运行时可以包含很多上下文、对象和变量。 几乎所有的 JS 引擎调用都要求有一个上下文的参数,所以在创建了运行时之后你的应用程序首先要做的一件事情是调用 JS_NewContext来至少创建一个上下文。 实际你需要的上下文数量由你的应用程序中所期望同时运行的脚本的数量决定。从另一方面说, 如果同一时间只有一个脚本被编译执行

9、,那么你就知需要建立单独的一个上下文,你可以对每个脚本重复使用它。 在你新建了上下文之后,你会通常想要初始化引擎内置的JS对象,可以通过调用 JS_InitStandardClasses实现。内置的对象有Array,Boolean,Date,Math,Number, 和String字符串对象,大多数脚本都会用到。 大多数应用程序也要用到自定义JS 对象。这些对象是特定于你的应用程序的。他们通常代表了数据结构和应用程序中脚本使用的方法。要新建一个自定义对象,你要组装一个 JS类来生成这个对象, 调用 JS_InitClass来在运行时设立这个类,然后调用 JS_NewObject来在引擎中新建你

10、这个自定义对象的实例。最后,如果你的对象有一些属性,你也许要通过调用JS_SetProperty 来设置他们的默认值。 即使你在创建一个对象的时候给JS 引擎传递了一个特定的上下文,最后这个对象还是独立于这个上下文存在的。 任何脚本都可以和任意上下文相关联来访问任何对象。图 1.3 描述了脚本和运行时、上下文以及对象之间的关系。 图 1.3名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 36 页 - - - - - - - - - 如图 1.3 所示, 脚本和上下文完全是

11、互相独立存在的及时他们可以访问相同的对象。 在给定的运行时中, 一个应用程序可以任意未分配的上下文来访问任何对象。也可能有时你想确保能为独占的使用而保留某些上下文和对象。在这些情况下,给你的应用程序新建单独的运行时:一个针对共享上下文和对象,另一个(或者更多的,取决于你的应用程序的需求)针对私有的运行时和对象。 注意:同一时间只能有一个线程被授权访问特定上下文。 构建引擎 在你可以在你的应用程序中使用JS 之前, 你必须将 JS引擎构建成一个可共享的库。在大多数情况下,引擎代码已经包括了Make文件来自动构建。 例如,在 Unix 下,js 源代码目录包括了一个基本的Gnu Make文件Mak

12、efile.ref和一个 config目录。config目录包括了平台特定的.mk文件来配合 Makefile.ref对你的环境进行构建。在Windows NT下,NMake文件是js.mak。 请阅读源代码目录中任何的readme文件,也许其中包括了和更新的编译指导或者其他信息。 嵌入引擎有什么必要条件? 如果要让你的应用程序可以执行JS,就要在你的应用程序代码中嵌入合适的引擎。嵌入一般有五步: 1. 在你的 C模块中加入#include jsapi.h来确保编译器知道有哪些引擎的API 可以调用。极少部分特殊的JS引擎工作时会要求你包含额外的头文名师资料总结 - - -精品资料欢迎下载 -

13、 - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 36 页 - - - - - - - - - 件。例如,要在你的应用程序中调用JS调试器,你要在合适的模块里面包含 jsdbgapi.h 。 大部分在 JS源代码中的其它的头文件不应该被引用。这样做可能会使你的程序依赖于引擎内部的接口, 而这些接口可能随着版本发布而更改。 1. 在你的应用程序中提供支持结构和变量声明。例如,如果你打算给JS引擎传递一个脚本呢,提供一个字符串变量保存了你的应用程序的脚本的版本的文字信息。使用jsapi.h中定义的 JS 数据类型来声明结

14、构和变量。 2. 使用 JavaScript编写特定应用的对象。这些对象常常会与操作在你C程序中的结构的结构和方法进行通讯,特别是如果你在使用JS 引擎来自动操作你的应用程序。 3. 在程序代码中嵌入合适的JS 引擎 API 调用和变量引用,包括初始化内置JS对象,和创建组成任何应用程序要用的自定义对象。 4. 大多数 JS 引擎调用都会返回一个值。如果这个值是零或者空,它通常表示一个错误的情况发生了。 如果值非零,它一般表示成功; 在这些情况下,返回的值常常会是你的程序需要使用的指针,或者存起来留以后引用。 很重要的是,你的程序至少应该每次检查JS 调用返回的值。 以下代码片断描述了嵌入使用

15、的大部分过程,除了JS 脚本的建立,这点也不在本文的介绍范围之内。如要查询有关创建脚本的信息 JavaScript这个语言请看客户端 JavaScript 指导,如果要得到关于编写服务器端对象,见服务器端 JavaScript 指导。 . . . #include #include #include /* 包含 JS引擎 API头文件 */#include jsapi.h. . . /* 主程序建立全局 JS变量,包括运行时 , * 一个上下文,和一个全局对象,然后初始化 JS运行时 , * 并创建一个上下文 . */int main (int argc, char *argv )int c,

16、 i; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 36 页 - - - - - - - - - /* 建立全局的 JS变量,包括全局和自定义对象 */ JSVersion version; JSRuntime *rt; JSContext *cx; JSObject *glob, *it; JSBool builtins; /* 初始化 JS运行时,并返回结果给 rt */ rt = JS_NewRuntime( 8L * 1024L * 1024L) ; /* 如

17、果 rt 没有值,结束程序 */if(!rt )return1; /* 新建一个上下文并且把它和 JS运行时相关联 */ cx = JS_NewContext( rt, 8192) ; /* 如果 cx 没有值,在此结束程序 */if(cx = NULL )return1; /* 新建全局对象 */ glob = JS_NewObject( cx, clasp, NULL , NULL ); /* 初始化内置 JS对象和全局对象 */ builtins = JS_InitStandardClasses( cx, glob) ; . . . return0; 这个范例代码十分简单,它描述了嵌入J

18、S 引擎调用所必须的关键元素。如果想要更完整的例子也就是以上这段代码片断的出处参见js.c ,这个范例应用的源代码是包含在JS引擎的源代码中的。 理解关键嵌入开发概念 大多数你要创建的JavaScript应用,你都会想要遵循一些权威的的JS API 嵌入实践。以下部分讲述了任何程序中都要使用到的API 调用。 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 36 页 - - - - - - - - - 在很多情况下, 嵌入某些特定 API 调用的顺序决定这个程序的成功。例

19、如,你必须在调用其它 JS 引擎函数之前初始化一个JS 运行时。相应的,你要在关闭程序之前释放 JS 运行时。因此,典型的程序的 main 函数像一种三明治, 在任何你提供的功能前后先初始化最后释放JS运行时: int main ( int argc, char *argv )int c, i; /* 建立全局 JS变量,包括全局对象 global 和自定义对象 */ JSVersion version; JSRuntime *rt; JSContext *cx; JSObject *glob, *it; . . . /* 初始化 JS运行时,并把返回的结果放在 rt 中 */ rt = JS

20、_NewRuntime( 8L * 1024L * 1024L) ; /* 如果 rt 没有值,程序结束。 */if(!rt )return1; . . . /* 建立一个上下文 */ cx = JS_NewContext( rt, 8192) ; /* 如果 cx 值为空,则结束程序 */if(cx = NULL )return1; /* 初始化内置 JS对象和全局对象 */ builtins = JS_InitStandardClasses( cx, glob) ; . . . 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - -

21、 名师精心整理 - - - - - - - 第 7 页,共 36 页 - - - - - - - - - /* 把你的代码扔这里,包括你要用来创建自定义 JS对象的 JS API函数调用。 * JS对象模型在这里开始。 */ . . . /* 在退出应用程序之前,释放 JS运行时 */ JS_DestroyRuntime (rt ); 正如这个例子所描述的, 嵌入了 JS引擎的函数的应用程序要负责建立JS运行时,这是他最先要完成的动作之一, 同时它还要负责在退出之前释放运行时。一般来说,确保运行时被初始化和释放的最佳位置是在中央JS调度程序的模块中嵌入必要的调用,无论你将使用哪一个模块作为在应

22、用程序的中央调度模块。 在你初始化了运行时之后,你可以建立应用程序的JS 对象模型。这个对象模型决定了你的 JS 对象互相之间的关系。JS 对象本质上是分层次的。所有的JS对象都是默认与全局(global )对象相关的,他们都是全局对象的子孙。当你初始化标准 JS类的时候,你会自动获得一个全局对象: builtins = JS_InitStandardClasses( cx, glob) ; 全局对象会建立一些基本属性和方法,其他对象都会继承这些属性和方法。当你创建你自己的对象时, 他们可以自动使用这些已经定义在全局对象上的属性和方法。你可以通过在自定义对象上重新对他们进行定义来覆盖这些默认属

23、性和方法,否则可以直接接受默认的赋值。 你也可以基于其他的内置JS 对象新建自定义对象,或者基于其他自定义对象来新建对象。无论哪种情况, 你新建的对象在继承链中将继承他祖先的所有属性和方法,一直追溯到全局对象。 如果要了解更多关于全局和自定义对象地内容,请参见“ 初始化内置和全局JS 对象”以及“ 创建和初始化自定义对象 ”。 管理一个运行时 JS运行时是一块内存空间,在这里面JS引擎可以管理与 JS 函数和脚本相关的上下文、对象和变量。 在执行任何 JS函数或者是脚本之前,你必须初始化一个运行时。初始化运行时的API 调用是 JS_NewRuntime。JS_NewRuntime 有一个参数

24、,是一个无符号整数, 它指明了在垃圾收集发生之前,分配给运行时的内存最大数值,单位是字节。 例如: rt = JS_NewRuntime ( 8L * 1024L * 1024L); 如上面列举的,JS_NewRuntime也会返回一个值,这个值是一个指向新建的运行时的指针。一个非空的返回值表示运行时被成功创建了。 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 36 页 - - - - - - - - - 一般来说, 一个应用程序只需要一个运行时。但是,你还是可以创建多

25、个运行时的,我们可以在必要的时候调用JS_NewRuntime并把返回值存在不同的指针中。当不再需要 JS 运行时的时候,应该把它销毁来释放他占用的内存资源,以便给其他应用程序来使用。根据你的应用程序中JS的使用范围,你可以选择在JS使用结束立刻销毁运行时, 或者,你可以选择一直保留运行时知道你的应用程序即将结束。 无论哪种情况, 都必须使用 JS_DestroyRuntime 来释放运行时, 当运行时不再需要的时候: JS_DestroyRuntime ( rt ) ; 如果你使用了多个运行时,要确保在结束应用程序前,每一个都被正确释放了。管理上下文 几乎所有的 JS API 调用都要求你传

26、送一个上下文作为参数。在 JavaScript引擎中,一个上下文唯一对应一个脚本。引擎把上下文信息传送给运行脚本的那个线程。 每个同步执行的脚本必须被分配一个唯一的上下文。当一个脚本执行完之后,他的上下文就不再被使用了, 这时候这个上下文就可以再次被分配给一个新的脚本,或者可以释放他。 要为一个脚本创建新的上下文, 可以使用 JS_NewContext函数。该函数有两个参数:一个指针指向上下文所需结合的运行时,和为上下文分配的栈空间的大小,以字节为单位。如果成功,函数返回新建的上下文的指针。例如: JSContext *cx; . . . cx = JS_NewContext ( rt, 81

27、92) ; 运行时必须已经存在。 你为上下文指定的栈的大小应该足够容纳使用这个上下文的脚本所创建的任何变量和对象。 注意和分配和维护上下文相关有一个特定的数量,因为你可能要: 1. 只创建同一时刻在你的应用程序中所需要的数量一样多的上下文。 2. 只要上下文有可能被应用程序用到,就保留他们, 而不是每当需要的时候再重新新建不需要了就立刻销毁。 当不再需要某一个上下文时, 应该把它销毁来释放它占用的内存资源留给其他的应用使用。根据你的应用程序中的JS 使用范围,你可以选择在使用完上下文之后,就立刻销毁,或者,更多情况下,你可以考虑为以后重复使用来保留上下文直到应用程序结束为止。不管哪种情况,当他

28、不再需要用到的时候,可以使用名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 36 页 - - - - - - - - - JS_DestroyContext 来释放上下文。这个函数带一个参数,也就是指向要销毁的上下文的指针: JS_DestroyContext ( cx) ; 如果你的应用创建了多个运行时的话, 应用程序需要了解上下文和哪个运行时相关联。在这种情况下,可以调用JS_GetRuntime ,并且把上下文作为参数传递给他。JS_GetRuntime 会返回一个

29、指向某个合适的运行时的指针,如果存在的话:rt = JS_GetRuntime( cx) ; 当你创建一个上下文的时候, 你要给他分配栈空间, 这个空间将为那些被使用这个上下文的脚本所创建的变量和对象所使用。你也可以用给定的上下文仅仅用来储存大量数据,只要分配所需的最小的栈空间。调用JS_SetContextPrivate函数来建立一个指向上下文使用的私有数据的指针,并调用JS_GetContextPrivate函数来获取这个指针,这样就可以访问这些数据了。你的应用程序要负责创建和管理这个可选的私有数据。 若要创建私有数据并把它和一个上下文关联: 1. 根据需要建立私有数据,可以使用一个普通的

30、 C void 指针变量。 2. 调用 JS_SetContextPrivate ,并指明通过哪个上下文来建立私有数据,并给出指向数据的指针。 例如: JS_SetContextPrivate(cx, pdata); 如果要在以后获取数据,调用JS_GetContextPrivate函数,并把上下文作为参数传递给他。该函数会返回指向私有数据的指针: pdata = JS_GetContextPrivate(cx); 初始化内置的和全局的JS 对象 JavaScript引擎提供了一些内置对象,他们会简化你的某些开发任务。例如,内置的 Array 对象让你更方便地在JS 引擎中创建和处理数组结构。

31、类似,Date对象提供了一个统一的处理日期数据的机制。要查阅引擎支持的内置对象的完整列表,请参看 JS_InitStandardClasses。 JS引擎始终使用函数和全局对象。一般来说,全局对象存在于JS脚本的场景背后,为所有其它 JS对象提供了一个默认的空间范围和存储了你在程序中创建和使用的全局变量。 在你创建你自己的对象之前, 你需要初始化全局对象。 函数对象将启用对象支持和构造器调用。 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 36 页 - - - - -

32、 - - - - JS_InitStandardClasses, 这个API 调用将初始化全局和函数对象还有引擎内置的对象,这样你的应用程序就可以使用他们了: JSBool builtins; . . . builtins = JS_InitStandardClasses(cx, glob); JS_InitStandardClasses会返回一个 JS boolean 值来表示初始化是否成功。 你可以为你的应用程序指定一个不同的全局对象。例如, Netscape Navigator就使用了他自己的全局对象window 。若要为你的应用程序更改全局对象,可以调用 JS_SetGlobalObj

33、ect函数。 详细信息请查阅 JS_SetGlobalObject的参考条目。 创建和初始化自定义对象 除了可以使用引擎内置对象之外,你还可以新建、初始化和使用你自己的JS对象。如果你使用 JS引擎处理脚本对你的应用进行自动化操作,这点尤其重要。自定义 JS对象可以提供最直接的程序服务,另外他们也可以作为你的程序服务的一个接口。例如,一个自定义JS 对象提供了某种直接的服务,像处理应用程序所有的网络访问、作为数据服务的中间层。也可以是使用一个JS 对象映射到应用程序中以后的数据和函数中,这样能为 C代码提供一个面向对象的接口。 这样一个自定义对象对应用程序自身来说扮演了一个接口的角色从应用程序

34、中把值传递给用户, 并且接受和处理用户的输入然后再返回给应用程序。这种对象也可以用来对应用程序内部的函数进行访问控制。 有两种方法可以创建自定义对象: ?写一个 JS 脚本,用来创建对象,以及他的属性、方法和构造器,然后把这个脚本在运行时传递给JS 引擎。 ?在你的程序中嵌入定义对象的属性和方法的代码,调用引擎来初始化新对象,然后通过其它的引擎调用来设置对象的属性。这个方法的一个好处是你的程序可以包含直接处理所嵌对象的本地方法。 无论哪种情况, 如果你创建了一个对象然后要将他在运行时中持久化,以便在此运行时中可以被其他对象调用,那么你必须通过JS_AddRoot或 JS_AddNamedRoo

35、t 调用来确定这个对象的“根”。使用这两个函数会确保JS引擎去跟踪这些对象并在适当的时候通过垃圾收集过程中清理掉他们。 从脚本中建立一个对象 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 36 页 - - - - - - - - - 要从脚本中创建自定义JS对象的一个原因是,只需要一个在脚本运行期间存在对象。要创建这种持续在脚本调用期间的对象的话,你也可以直接在你的应用程序中嵌入对象的代码,而不用使用一个脚本。 注意: 你同样可以使用脚本创建持久对象。 要使用脚本创建

36、一个自定义对象: 1. 定义和说明对象。 他的目的是什么?他的数据成员(属性)有哪些?他有哪些方法(函数)?他是否需要一个运行时构造函数? 2. 编写出定义和创建对象的JS 脚本。例如: 3.function myfun ()4.var x = newObject() ; 5. 6. 7. 注意: 使用 JavaScript编写的对象并不在应用程序嵌入JS引擎的代码中。关于对象编写的更多内容,请参阅客户端JavaScript指导和服务器端JavaScript指导。 在应用程序中嵌入合适的JS 引擎调用来编译和执行脚本。 你有两种选择:1.) 仅使用一个函数调用来编译和执行脚本:JS_Evalu

37、ateScript, JS_EvaluateUCScript或者 2.) 使用JS_CompileScript或者 JS_CompileUCScript , 来一次性编译脚本, 然后可以用一个独立的函数调用JS_ExecuteScript . 来重复执行已经编译的代码。这些调用的“UC ”版可以提供对统一码脚本的支持。 你使用脚本创建的一个对象只可以在脚本的生命周期内启用,或者也可以在脚本运行结束之后持久化。 一般来说,一旦脚本运行结束, 他的所有对象都会被销毁。在大部分情况下,这种行为正是你的应用程序需要的。然而,在其他的情况下,你可能希望某对象持续在脚本之间,或者你的应用程序的整个生命周期

38、。这样的话你需要直接在你的应用程序中嵌入对象创建代码,或者你必须把对象直接连接到全局对象这样他会一直持续只要全局对象本身存在。 在应用程序中嵌入一个自定义对象 当必须进行对象持久化时, 或者你认为需要对几个脚本都可用的对象时,嵌入一个自定义 JS 对象在应用程序中是很有用的。 例如,一个代表了用户的ID 和访问权限的自定义对象可能会在应用程序的整个生命期中都会用到。他事先一次性创名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 36 页 - - - - - - - - -

39、 建和组装了对象,节省了很多时间,而不用每次要检验用户ID 或者权限时一遍又一遍用脚本创建对象。 一种在应用程序中嵌入自定义对象的方法是: 1. 创建一个 JSPropertySpec 数据类型,并把它和属性的信息组装成对象的属性,包括参数的获取(get)和设置(set)方法的名称。 2. 创建一个 JSFunctionSpec 数据类型,并把它和方法的信息组装成对象使用的方法。 3. 创建一个实际的 C函数用来处理对象的方法调用。 4. 调用 JS_NewObject或者 JS_ConstructObject来实例化这个对象。 5. 调用 JS_DefineFunctions来创建这个对象的

40、方法。 6. 调用 JS_DefineProperties来创建这个对象的属性。 描述持久的自定义JS 对象的代码必须放在应用程序执行的开始部分附近,在任何依赖于该对象的代码之前。 嵌入的实例化和组装自定义对象的引擎调用也应该出现在任何依赖这个对象的代码之前。 注意: 在大多数情况下还有一个更方便的在程序代码中创建自定义对象的方法是调用 JS_DefineObject来创建对象,然后反复调用JS_SetProperty来设置对象的属性。关于定义一个对象的更多的信息,参见JS_DefineObject 。关于设置对象属性的更多信息,参见JS_SetProperty 。 为对象提供私有数据 像上下

41、文那样,你可以把大量的数据和一个对象相关联而无需把数据存储在这个对象中。调用 JS_SetPrivate来建立一个指向私有数据的指针,并且调用JS_GetPrivate 来获得这个指针这样就可以访问数据了。你的应用程序要对这些可选的私有数据的创建和管理负责。 要创建私有数据并把它和一个对象相关联的话: 1. 根据需要建立私有数据,可以使用一个普通的 C void 指针变量。 2. 调用 JS_SetPrivate, 制定要为那个对象建立私有数据,并给出指向数据的指针。 例如: JS_SetPrivate(cx, obj, pdata); 如果要以后再获取数据, 调用 JS_GetPrivate

42、并且把对象作为一个参数传递。 这个函数将返回一个指向对象私有数据的指针: pdata =JS_GetPrivate(cx, obj); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 36 页 - - - - - - - - - 处理统一码(Unicode) JS引擎现在提供了很多API 函数的支持统一码的版本。这些函数允许你直接给引擎传递使用统一码编码的脚本进行编译和运行。下面的表格列出了标准引擎函数和他们对应的统一码版本: 标准函数 统一码支持函数 JS_Defin

43、eProperty JS_DefineUCProperty JS_DefinePropertyWithTinyId JS_DefineUCPropertyWithTinyId JS_LookupProperty JS_LookupUCProperty JS_GetProperty JS_GetUCProperty JS_SetProperty JS_SetUCProperty JS_DeleteProperty2 JS_DeleteUCProperty2 JS_CompileScript JS_CompileUCScript JS_CompileScriptForPrincipals JS_C

44、ompileUCScriptForPrincipals JS_CompileFunction JS_CompileUCFunction JS_CompileFunctionForPrincipalsJS_CompileUCFunctionForPrincipals JS_EvaluateScript JS_EvaluateUCScript JS_EvaluateScriptForPrincipals JS_EvaluateUCScriptForPrincipals JS_NewString JS_NewUCString JS_NewStringCopyN JS_NewUCStringCopyN

45、 JS_NewStringCopyZ JS_NewUCStringCopyZ JS_InternString JS_InternUCString - JS_InternUCStringN 处理统一码的函数工作方式与原来的同名函数一样,除了原来的函数使用参数char * ,而统一码版本的函数参数为jschar * 。 操作 JS数据类型 JavaScript定义了他自己的数据类型。其中一部分直接对应C中的副本。其他的,诸如 JSObject,jsdouble, 和 JSString ,对 JavaScript有特殊意义。 名师资料总结 - - -精品资料欢迎下载 - - - - - - - -

46、- - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 36 页 - - - - - - - - - 一般而言,你在应用程序中声明和使用JS 数据类型就和使用标准C数据类型一样。然而,JS 引擎对 JS数据类型,也就是需要超过一个字空间的变量变量JSObject,jsdouble, 和JSString有不同的跟踪。引擎周期性地检查这些变量,察看他们是否还在使用中。 如果不再使用了, 就收集他们, 释放存储空间来重新使用。 垃圾收集可以有效重复利用堆的资源, 但是过分频繁的垃圾收集也会对性能造成影响。你可以根据 JS运行时控制垃圾收集的频率, 根据你给

47、程序分配的JS运行时的大小和你应用程序使用的JS变量和对象的数量之间的关系。如果你的程序要创建和使用很多JS 对象和变量,你可能就要分配足够大的运行时来减少垃圾收集的可能频率。 注意你的应用程序要在任何时候调用同样能JS_GC 或者 JS_MaybeGC 来强制进行垃圾收集。JS_GC 将强制进行垃圾收集。 JS_MaybeGC 则会根据条件进行垃圾收集,如果你调用这个函数时, 初始化时分配的空间的特定比例已经被使用的话,就进行垃圾收集。 操作 JS值 除了 JS 数据类型之外, JS 引擎也使用 JS 值,称之为 jsval 。一个 jsval本质上是一个指向任意 JS数据类型(除了整型)的

48、一个指针。对于整型, jsval直接包含了他自身的整数值。 在其他的情况下, 指针还会被编码, 添加关于它所指的数据的类型的额外信息。 使用可以提高引擎的效率, 同时也可以让很多API 函数来处理不同类型的数据。 引擎 API 包含了一组用来测试JS值中的 JS数据类型的宏。有: ?JSVAL_IS_OBJECT?JSVAL_IS_NUMBER?JSVAL_IS_INT?JSVAL_IS_DOUBLE?JSVAL_IS_STRING?JSVAL_IS_BOOLEANBesides testing ajsval,你也可以检测他是否属于一个基本JS 数据类型 ( JSVAL_IS_PRIMITIV

49、E )。基本类型包括未定义(undefined)、空(null )、 布尔(boolean)、数值(numeric)和字符串(string )类型。 你可以测试 jsval所指的值是否为 NULL(JSVAL_IS_NULL ) 或者void( JSVAL_IS_VOID )。 如果 jsval指向了一个 JS数据类型是 JSObject,jsdouble, 或者jsstr , 你可以将 jsval转换成他的内在的类型,只要相应使用JSVAL_TO_OBJECT,JSVAL_TO_DOUBLE和 JSVAL_TO_STRING。在某些情况下,你的名师资料总结 - - -精品资料欢迎下载 - -

50、 - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 36 页 - - - - - - - - - 应用程序或者 JS 引擎调用要求使用一个特定的数据类型的变量或者参数而非一个 jsval时,就很有用了。类似地,你可以使用OBJECT_TO_JSVAL,DOUBLE_TO_JSVAL, 和STRING_TO_JSVAL, 把JSObject,jsdouble, 和jsstr相应地转换成 jsval 。 操作 JS字符串 在 JavaScript中你的很多工作都回涉及字符串。JS引擎实现了一个JS字符串类型,JSString

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁