りんけーじ - 日記 - 2009年8月11日の日記



< 2009年8月 >
2627282930311
2345678
9101112131415
16171819202122
23242526272829
303112345
前の日: 2009年8月8日
次の日: 2009年10月17日

2009/08/11 15:21 [Javascriptをもっと遊ぶ]

2009/08/08の続き。

今日は関数をオブジェクトに定義して返してみる。

// returns a string "hoge"
static JSBool js_hoge(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
  *rval = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, "hoge"));
  return JS_TRUE;
}
// returns an object with declared function "call"
static JSBool js_hello(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
  JSObject *object = JS_NewObject(cx, NULL, NULL, NULL);
  if(!object)
    return JS_FALSE;
  if(!JS_DefineFunction(cx, object, "call", js_hoge, 0, 0))
    return JS_FALSE;
  *rval = OBJECT_TO_JSVAL(object);
  return JS_TRUE;
}
// initialiser
JSObject *js_InitMyClass(JSContext *cx, JSObject *obj) {
  if(!JS_DefineFunction(cx, obj, "hello", js_hello, 0, 0))
    return NULL;
  return (JSObject *)1;
}

test.jsはこんな感じに。

var o = hello();
print("o = " + o);
print("o.call = " + o.call);
print("o.call() = " + o.call());

実行結果。

% ./FreeBSD7.1-RELEASE-p6_DBG.OBJ/js test.js
o = [object Object]
o.call = function call() {
    [native code]
}
o.call() = hoge

ちゃんと呼べてる。これで外部APIを呼ぶ準備ができた。

コメント(0) トラックバック(0)