【cocos2d-x从c++到js】10:JS与C++的交互2——JS与C++的“函数重载”问题

简介:

对于C++来说,存在函数重载,例如:


1
2
void  CCNode::setScale( float  scale)
void  CCNode::setScale( float  scaleX, float  scaleY)

这两个函数的函数名是一样的,但是参数表不同。最终在编译器编译后的函数签名不一样。


但是在JavaScript中并没有这种机制。怎么破?存在两种情况:


第一种、JS需要调用重载的C++函数接口

我们就以上面的函数为例,来看看在cxx-generator的自动生成代码中,函数重载是如何处理的。打开jsb_cocos2dx_auto.cpp,找到如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
JSBool js_cocos2dx_Node_setScale(JSContext *cx, uint32_t argc, jsval *vp)
{
     jsval *argv = JS_ARGV(cx, vp);
     JSBool ok = JS_TRUE;
     JSObject *obj = NULL;
     cocos2d::Node* cobj = NULL;
     obj = JS_THIS_OBJECT(cx, vp);
     js_proxy_t *proxy = jsb_get_js_proxy(obj);
     cobj = (cocos2d::Node *)(proxy ? proxy->ptr : NULL);
     JSB_PRECONDITION2( cobj, cx, JS_FALSE,  "js_cocos2dx_Node_setScale : Invalid Native Object" );
     do  {
         if  (argc == 2) {
             double  arg0;
             ok &= JS_ValueToNumber(cx, argv[0], &arg0);
             if  (!ok) { ok = JS_TRUE;  break ; }
             double  arg1;
             ok &= JS_ValueToNumber(cx, argv[1], &arg1);
             if  (!ok) { ok = JS_TRUE;  break ; }
             cobj->setScale(arg0, arg1);
             JS_SET_RVAL(cx, vp, JSVAL_VOID);
             return  JS_TRUE;
         }
     while (0);
     do  {
         if  (argc == 1) {
             double  arg0;
             ok &= JS_ValueToNumber(cx, argv[0], &arg0);
             if  (!ok) { ok = JS_TRUE;  break ; }
             cobj->setScale(arg0);
             JS_SET_RVAL(cx, vp, JSVAL_VOID);
             return  JS_TRUE;
         }
     while (0);
     JS_ReportError(cx,  "js_cocos2dx_Node_setScale : wrong number of arguments" );
     return  JS_FALSE;
}

只是通过argc参数简单判断了一下参数个数,然后就执行对应的分支代码就好了。但是如果遇到参数个数相同,而类型不同的情况呢?尚不得而知。


第二种、不需要调用C++函数接口,直接在JS层代码中模拟一下函数重载。这个就要利用JS语言的一些特性了。我们直接看Cocos2d-html5中的对应代码。哦,no,因为html5里面关于CCNode::setScale函数写了一点杂技代码。所以我们改成看setPosition函数吧。也是一样的。

1
2
3
4
5
6
7
8
9
10
11
setPosition: function  (newPosOrxValue, yValue) {
     var  locPosition =  this ._position;
     if  (arguments.length == 2) {
         locPosition._x = newPosOrxValue;
         locPosition._y = yValue;
     else  if  (arguments.length == 1) {
         locPosition._x = newPosOrxValue.x;
         locPosition._y = newPosOrxValue.y;
     }
     this .setNodeDirty();
},


可以看到,该代码使用了JS的arguments来判断参数个数,然后执行对应的分支代码。


 本文转自 老G 51CTO博客,原文链接:http://blog.51cto.com/goldlion/1354185,如需转载请自行联系原作者

相关文章
|
数据采集 人工智能 自然语言处理
Midscene.js:AI 驱动的 UI 自动化测试框架,支持自然语言交互,生成可视化报告
Midscene.js 是一款基于 AI 技术的 UI 自动化测试框架,通过自然语言交互简化测试流程,支持动作执行、数据查询和页面断言,提供可视化报告,适用于多种应用场景。
4427 1
Midscene.js:AI 驱动的 UI 自动化测试框架,支持自然语言交互,生成可视化报告
|
存储 JavaScript 前端开发
【JavaScript】网页交互的灵魂舞者
本文介绍了 JavaScript 的三种引入方式(行内、内部、外部)和基础语法,包括变量、数据类型、运算符、数组、函数和对象等内容。同时,文章还详细讲解了 jQuery 的基本语法和常用方法,如 `text()`、`html()`、`val()`、`attr()` 和 `css()` 等,以及如何插入和删除元素。通过示例代码和图解,帮助读者更好地理解和应用这些知识。
246 1
【JavaScript】网页交互的灵魂舞者
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
1090 5
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
524 4
|
设计模式 前端开发 JavaScript
揭秘!前端大牛们如何巧妙利用JavaScript,打造智能交互体验!
【10月更文挑战第30天】前端开发领域充满了无限可能与创意,JavaScript作为核心语言,凭借强大的功能和灵活性,成为打造智能交互体验的重要工具。本文介绍前端大牛如何利用JavaScript实现平滑滚动、复杂动画、实时数据更新和智能表单验证等效果,展示了JavaScript的多样性和强大能力。
444 4
|
程序员 C++
C++中的函数重载有什么作用
【10月更文挑战第19天】C++中的函数重载有什么作用
328 3
|
JavaScript 前端开发
JavaScript 与 DOM 交互
【9月更文挑战第01天】
245 2
|
自然语言处理 编译器 Linux
【C++】巧用缺省参数与函数重载:提升编程效率的秘密武器
【C++】巧用缺省参数与函数重载:提升编程效率的秘密武器
217 0
|
程序员 C++ 开发者
C++入门教程:掌握函数重载、引用与内联函数的概念
通过上述介绍和实例,我们可以看到,函数重载提供了多态性;引用提高了函数调用的效率和便捷性;内联函数则在保证代码清晰的同时,提高了程序的运行效率。掌握这些概念,对于初学者来说是非常重要的,它们是提升C++编程技能的基石。
204 0

热门文章

最新文章