$cache[$key] = empty($arr) ? NULL : $arr; return $cache[$key]; } // 门户 获取需要在频道显示的栏目主题数据 function portal_channel_thread($fid) { global $forumlist; if (empty($fid)) return NULL; $orderby = array('tid' => 1); $page = 1; // 遍历所有在频道显示内容的栏目 $category_forumlist = channel_category($fid); $arrlist = array(); $forum_tids = array(); $tidlist = array(); if ($category_forumlist) { foreach ($category_forumlist as &$_forum) { // 频道显示数据 $arrlist['list'][$_forum['fid']] = array( 'fid' => $_forum['fid'], 'name' => $_forum['name'], 'rank' => $_forum['rank'], 'type' => $_forum['type'], 'url' => $_forum['url'], 'channel_new' => $_forum['channel_new'], ); $forum_thread = thread_tid__find(array('fid' => $_forum['fid']), $orderby, $page, $_forum['channel_new'], 'tid', array('tid')); // 最新信息按栏目分组 foreach ($forum_thread as $key => $_thread) { $forum_tids[$key] = $_thread; } unset($forum_thread); } $tidlist += $forum_tids; } unset($category_forumlist); // 获取属性对应的tid集合 list($flaglist, $flagtids) = flag_thread_by_fid($fid); empty($flagtids) || $tidlist += $flagtids; unset($flagtids); // 频道置顶 $stickylist = sticky_list_thread($fid); empty($stickylist) || $tidlist += $stickylist; // 在这之前合并所有二维数组 tid值为键/array('tid值' => tid值) $tidarr = arrlist_values($tidlist, 'tid'); // 在这之前使用$tidarr = array_merge($tidarr, $arr)前合并所有一维数组 tid/array(1,2,3) if (empty($tidarr)) { $arrlist['list'] = isset($arrlist['list']) ? array_multisort_key($arrlist['list'], 'rank', FALSE, 'fid') : array(); return $arrlist; } $tidarr = array_unique($tidarr); $pagesize = count($tidarr); // 遍历获取的所有tid主题 $threadlist = well_thread_find_asc($tidarr, $pagesize); // 遍历时为升序,翻转为降序 $threadlist = array_reverse($threadlist); foreach ($threadlist as &$_thread) { // 各栏目最新内容 isset($forum_tids[$_thread['tid']]) AND $arrlist['list'][$_thread['fid']]['news'][$_thread['tid']] = $_thread; // 全站置顶内容 isset($stickylist[$_thread['tid']]) AND $arrlist['sticky'][$_thread['tid']] = $_thread; // 首页属性主题 if (!empty($flaglist)) { foreach ($flaglist as $key => $val) { if (isset($val['tids']) && in_array($_thread['tid'], $val['tids'])) { $arrlist['flaglist'][$key][array_search($_thread['tid'], $val['tids'])] = $_thread; ksort($arrlist['flaglist'][$key]); $arrlist['flag'][$_thread['tid']] = $_thread; } } } } unset($threadlist); if (isset($arrlist['sticky'])) { $i = 0; foreach ($arrlist['sticky'] as &$val) { ++$i; $val['i'] = $i; } } if (isset($arrlist['flag'])) { $i = 0; foreach ($arrlist['flag'] as &$val) { ++$i; $val['i'] = $i; } } if (isset($arrlist['flaglist'])) { foreach ($arrlist['flaglist'] as &$val) { $i = 0; foreach ($val as &$v) { ++$i; $v['i'] = $i; } } } isset($arrlist['list']) AND $arrlist['list'] = array_multisort_key($arrlist['list'], 'rank', FALSE, 'fid'); return $arrlist; } ?>JavaScript: invoke function or call a property via reflection - Stack Overflow
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

JavaScript: invoke function or call a property via reflection - Stack Overflow

programmeradmin0浏览0评论

Is there a way to call a function (or a property) on an object via reflection, in JavaScript?

Lets say that during run-time, my code has already determined that objectFoo indeed has a property called 'bar'. Now that my code knows that, the next thing I want to do is invoke that. Normally i would do this: var x = objectFoo.bar. But 'bar' was determined at run time, so I need to invoke it using reflection.

Is there a way to call a function (or a property) on an object via reflection, in JavaScript?

Lets say that during run-time, my code has already determined that objectFoo indeed has a property called 'bar'. Now that my code knows that, the next thing I want to do is invoke that. Normally i would do this: var x = objectFoo.bar. But 'bar' was determined at run time, so I need to invoke it using reflection.

Share Improve this question edited Dec 22, 2009 at 19:15 7wp asked Dec 22, 2009 at 19:09 7wp7wp 12.7k20 gold badges78 silver badges107 bronze badges
Add a comment  | 

4 Answers 4

Reset to default 7

In JavaScript, object methods are really just properties containing functions. Like all properties, you can refer to them using associative array syntax:

var x = { 'a': 1 };
x.a += 1;
x['a'] += 1;
console.log(x.a);

Output is: 3.

So if you have the name of a method you want to invoke on myObject:

var methodName = 'myMethod';

// Invoke the value of the 'myMethod' property of myObject as a function.
myObject[methodName]();

EVAL: http://www.w3schools.com/jsref/jsref_eval.asp

Eval will allow you to run any javascript code by passing in a string and having the javascript engine evaluate it as javascript code.

If you mean that you want to first search a list properties of an object, then look at this:

var o = {}
for(att in o){
    alert(o[att]);
}

If you do this, you can even set the property's value by accessing it as if it were an array (all objects are actually associative arrays).

obj["propertyName"] = "new value";
obj["MethodName"]();

Create object (invoke constructor) via reflection:

SomeClass = function(arg1, arg2) {
    console.log('Your reflection');
}

ReflectUtil.newInstance('SomeClass', 5, 7);

and implementation:

var ReflectUtil = {};

/**
 * @param strClass:
 *          class name
 * @param optionals:
 *          constructor arguments
 */
ReflectUtil.newInstance = function(strClass) {
    var args = Array.prototype.slice.call(arguments, 1);
    var clsClass = eval(strClass);
    function F() {
        return clsClass.apply(this, args);
    }
    F.prototype = clsClass.prototype;
    return new F();
};

Create a register object:

var funcRegister = {};

Create a function to call the other:

var callReflectionFunc = function(type, obj) {
    var func = false;
    if(funcRegister[type])
        func = funcRegister[type](obj);

    return func;
}

Populate your register with functions:

funcRegister['yourtype1'] = function(obj) {
    console.log('your type 2');

    return obj;
}

funcRegister['yourtype2'] = function(obj) {
    console.log('your type 2');

    return obj;
}

Then call it with your type and an object where you can put your args

callReflectionFunc(type, obj);
发布评论

评论列表(0)

  1. 暂无评论