RSS
热门关键字:  数据挖掘  人工智能  数据仓库  搜索引擎  数据挖掘导论
当前位置 :| 首页>编程技术>脚本语言>

JavaScript - Using the JS API

来源: 作者:unkonwn 时间:2004-12-02 点击:

Starting up

    /*
     * Tune this to avoid wasting space for shallow stacks, while saving on
     * malloc overhead/fragmentation for deep or highly-variable stacks.
     */
    #define STACK_CHUNK_SIZE    8192

    JSRuntime *rt;
    JSContext *cx;

    /* You need a runtime and one or more contexts to do anything with JS. */
    rt = JS_NewRuntime(0x400000L);
    if (!rt)
        fail("can′t create JavaScript runtime");
    cx = JS_NewContext(rt, STACK_CHUNK_SIZE);
    if (!cx)
        fail("can′t create JavaScript context");

    /*
     * The context definitely wants a global object, in order to have standard
     * classes and functions like Date and parseInt.  See below for details on
     * JS_NewObject.
     */
    JSObject *globalObj;

    globalObj = JS_NewObject(cx, &my_global_class, 0, 0);
    JS_InitStandardClasses(cx, globalObj); 

数据挖掘实验室

Defining objects and properties

    /* Statically initialize a class to make "one-off" objects. */
    JSClass my_class = {
        "MyClass",

        /* All of these can be replaced with the corresponding JS_*Stub
           function pointers. */
        my_addProperty, my_delProperty, my_getProperty, my_setProperty,
        my_enumerate,   my_resolve,     my_convert,     my_finalize
    };

    JSObject *obj;

    /*
     * Define an object named in the global scope that can be enumerated by
     * for/in loops.  The parent object is passed as the second argument, as
     * with all other API calls that take an object/name pair.  The prototype
     * passed in is null, so the default object prototype will be used.
     */
    obj = JS_DefineObject(cx, globalObj, "myObject", &my_class, NULL,
                          JSPROP_ENUMERATE);

    /*
     * Define a bunch of properties with a JSPropertySpec array statically
     * initialized and terminated with a null-name entry.  Besides its name,
     * each property has a "tiny" identifier (MY_COLOR, e.g.) that can be used
     * in switch statements (in a common my_getProperty function, for example).
     */
    enum my_tinyid {
        MY_COLOR, MY_HEIGHT, MY_WIDTH, MY_FUNNY, MY_ARRAY, MY_RDONLY
    };

    static JSPropertySpec my_props[] = {
        {"color",       MY_COLOR,       JSPROP_ENUMERATE},
        {"height",      MY_HEIGHT,      JSPROP_ENUMERATE},
        {"width",       MY_WIDTH,       JSPROP_ENUMERATE},
        {"funny",       MY_FUNNY,       JSPROP_ENUMERATE},
        {"array",       MY_ARRAY,       JSPROP_ENUMERATE},
        {"rdonly",      MY_RDONLY,      JSPROP_READONLY},
        {0}
    };

    JS_DefineProperties(cx, obj, my_props);

    /*
     * Given the above definitions and call to JS_DefineProperties, obj will
     * need this sort of "getter" method in its class (my_class, above).  See
     * the example for the "It" class in js.c.
     */
    static JSBool
    my_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
    {
        if (JSVAL_IS_INT(id)) {
            switch (JSVAL_TO_INT(id)) {
              case MY_COLOR:  *vp = . . .; break;
              case MY_HEIGHT: *vp = . . .; break;
              case MY_WIDTH:  *vp = . . .; break;
              case MY_FUNNY:  *vp = . . .; break;
              case MY_ARRAY:  *vp = . . .; break;
              case MY_RDONLY: *vp = . . .; break;
            }
        }
        return JS_TRUE;
    } 数据挖掘研究院 

Defining functions

    /* Define a bunch of native functions first: */
    static JSBool
    my_abs(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
    {
        jsdouble x, z;

        if (!JS_ValueToNumber(cx, argv[0], &x))
            return JS_FALSE;
        z = (x < 0) ? -x : x;
        return JS_NewDoubleValue(cx, z, rval);
    }

    . . .

    /*
     * Use a JSFunctionSpec array terminated with a null name to define a
     * bunch of native functions.
     */
    static JSFunctionSpec my_functions[] = {
    /*    name          native          nargs    */
        {"abs",         my_abs,         1},
        {"acos",        my_acos,        1},
        {"asin",        my_asin,        1},
        . . .
        {0}
    };

    /*
     * Pass a particular object to define methods for it alone.  If you pass
     * a prototype object, the methods will apply to all instances past and
     * future of the prototype′s class (see below for classes).
     */
    JS_DefineFunctions(cx, globalObj, my_functions); 

数据挖掘实验室

Defining classes

    /*
     * This pulls together the above API elements by defining a constructor
     * function, a prototype object, and properties of the prototype and of
     * the constructor, all with one API call.
     *
     * Initialize a class by defining its constructor function, prototype, and
     * per-instance and per-class properties.  The latter are called "static"
     * below by analogy to Java.  They are defined in the constructor object′s
     * scope, so that ′MyClass.myStaticProp′ works along with ′new MyClass()′.
     *
     * JS_InitClass takes a lot of arguments, but you can pass null for any of
     * the last four if there are no such properties or methods.
     *
     * Note that you do not need to call JS_InitClass to make a new instance of
     * that class -- otherwise there would be a chicken-and-egg problem making
     * the global object -- but you should call JS_InitClass if you require a
     * constructor function for script authors to call via new, and/or a class
     * prototype object (′MyClass.prototype′) for authors to extend with new
     * properties at run-time.  In general, if you want to support multiple
     * instances that share behavior, use JS_InitClass.
     */
    protoObj = JS_InitClass(cx, globalObj, NULL, &my_class,

                            /* native constructor function and min arg count */
                            MyClass, 0,

                            /* prototype object properties and methods -- these
                               will be "inherited" by all instances through
                               delegation up the instance′s prototype link. */
                            my_props, my_methods,

                            /* class constructor properties and methods */
                            my_static_props, my_static_methods); 数据挖掘实验室 

Running scripts

    /* These should indicate source location for diagnostics. */
    char *filename;
    uintN lineno;

    /*
     * The return value comes back here -- if it could be a GC thing, you must
     * add it to the GC′s "root set" with JS_AddRoot(cx, &thing) where thing
     * is a JSString *, JSObject *, or jsdouble *, and remove the root before
     * rval goes out of scope, or when rval is no longer needed.
     */
    jsval rval;
    JSBool ok;

    /*
     * Some example source in a C string.  Larger, non-null-terminated buffers
     * can be used, if you pass the buffer length to JS_EvaluateScript.
     */
    char *source = "x * f(y)";

    ok = JS_EvaluateScript(cx, globalObj, source, strlen(source),
                           filename, lineno, &rval);

    if (ok) {
        /* Should get a number back from the example source. */
        jsdouble d;

        ok = JS_ValueToNumber(cx, rval, &d);
        . . .
    } 数据挖掘实验室 

Calling functions

    /* Call a global function named "foo" that takes no arguments. */
    ok = JS_CallFunctionName(cx, globalObj, "foo", 0, 0, &rval);

    jsval argv[2];

    /* Call a function in obj′s scope named "method", passing two arguments. */
    argv[0] = . . .;
    argv[1] = . . .;
    ok = JS_CallFunctionName(cx, obj, "method", 2, argv, &rval);  

Shutting down

    /* For each context you′ve created: */
    JS_DestroyContext(cx);

    /* For each runtime: */
    JS_DestroyRuntime(rt);

    /* And finally: */
    JS_ShutDown(); 

数据挖掘研究院

Debugging API

See the trap, untrap, watch, unwatch, line2pc, and pc2line commands in js.c. Also the (scant) comments in jsdbgapi.h.
最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
匿名?