上篇介绍了Node.js C++模块中编码部分的介绍。在此之前先罗列一些这方面的资料供参考入门。

v8数据结构的手册

node C++模块入门

从C++的角度了解node

(google 百度去,这些资料可以引导我们写出一个完整的Node.js的C++扩展了。但是也许下面的内容能够让你写的过程中更轻松。)

首先我们来理解

函数参数

C++模块中可以被node调用的方法都是如下形式的

Handle<Value> Method(const Arguments& args) {//code here
}

传入参数args对象有两个常用的操作:

Local<Value> arg = args[0]; //[]操作符,获取到一个Local<Value>的对象
int length = args.Length();  //Length方法,获取参数长度

在上述的代码中出现了local ,v8的继承关系如下:

Handle是v8维护一个对象引用,v8会负责对象的回收,可以看作是v8中的智能指针。local世纪城自它的一个轻量级的对象引用

数据类型转换

v8中整体的数据结构关系图如下:

可以看到,所有的String, Number, Boolean, Object, Array等对象都是从Value继承而来。因此从Arguments中获取的Local对象可以轻松的判断其js中的具体类型,并进行转换。

类型判断:

Local<Value> arg = args[0];
bool isArray = arg->IsArray();
bool isBoolean = arg->IsBoolean();
bool isNumber = arg->IsNumber();
bool isInt32 = arg->IsInt32();

v8提供了一系列的接口用来做类型判断,可以在其文档内找到所有的判断接口。

类型转换:

在经过类型判断之后,就可以根据结果进行类型的转换了:

Local<Value> arg = args[0];
Local<Object> = arg->ToObject();
Local<Boolean> = arg->ToBoolean();
Local<Number> = arg->ToNumber();
Local<Int32> = arg->ToInt32 ();
// more

同样的,v8提供了一系列的接口用来做类型转换,可以在其文档内找到所有的转换接口。注意,v8并没有提供直接的从Value到Array的转换,但是我们发现,Array是继承自Object的,而其实Array对象并没有提供比Object更多的接口。联系到js中,会发现,js中的Array和Object操作也是一样的相似。因此尽管v8没有提供从Value到Array的转换,但是转换成Object就已经足够了,因为完全可以把Array当作一个Object来操作。

而所有的v8中的Boolean/Number/Int32等对象都有方法转换成C++原生的bool/double/int等类型。当然,同样有反过来转换的接口。因此从javascript与C++跨语言的数据类型转换就完全不是问题了。

Object与Array

基础类型相对来说比较简单,而Object和Array相对来说需要更多的接口方法来进行设置和内容的获取。

//设置Object
Handle<v8::Object> v8Obj = v8::Object::New();
v8Obj->Set(v8::String::NewSymbol("key"), v8::Integer::New(1));
//查询是否有这个key,并获取对应的value
if (v8Obj->Has(v8::String::New("key"))) {Handle<v8::Value> value = v8Obj->Get(v8::String::New("key"));
//获取所有的key
Handle<Array> keys = v8Obj->GetOwnPropertyNames();
//获取object内元素的个数
int len = keys->Length();
//删除object内的元素
v8Obj->Delete(v8::String::New("key"));

是不是觉得上面的代码十分眼熟?

var obj = {};
obj.key = 1;
if (obj.hasOwnProperty('key')) {var value = obj.key;
}
var keys = Object.keys(obj);
var len = keys.length;
delete obj.key;

可以看到,js的代码完整的映射到了C++代码之上。

而Array也是一样的,先用一张图描述Array和Object的关系:

在V8中,Array的接口基本就只是多了一个Length方法,获取数组的长度,而其他的方法都是继承自Object,所以Array的操作和Object非常类似。

Handle<v8::Array> v8Arr = v8::Array::New(length);
int length = 10;
for (int i = 0; i != length; ++i) {v8Arr->Set(i, v8::Integer::New(i));
}Handle<Value> item = v8Arr->Get(10);

至此,js中的数据结构对应到v8中的部分基本已经罗列完毕,js与c++的数据交换也完全不是问题了,此时用c++写Node.js扩展基本已经没有问题了



Nood.js C++ 模块 addon插件(二)相关推荐

  1. 原生js封装十字参考线插件(一)

    需求来源: 拓扑图之机房平面图,显示机房长宽比例尺,房间内标注各种设备间距不易实现,特在机房平面图上层加一个十字参考线 横竖两条线垂直,在鼠标指针处交叉,显示鼠标指针坐标(相对机房平面图的坐标,不是相 ...

  2. node.js中模块_在Node.js中需要模块:您需要知道的一切

    node.js中模块 by Samer Buna 通过Samer Buna 在Node.js中需要模块:您需要知道的一切 (Requiring modules in Node.js: Everythi ...

  3. NodeJs C++ addon(插件nan方式)

    Native Abstractions for Node.js (nan) nan方式的好处:使用nan方式,编写的c++插件接口,会自动兼容不同版本的nodejs 因此,你的代码只需要随着 nan版 ...

  4. js插件---10个免费开源的JS音乐播放器插件

    js插件---10个免费开源的JS音乐播放器插件 一.总结 一句话总结:各种插件都有很多,多去找. 二.js插件---10个免费开源的JS音乐播放器插件 亲测可用 音乐播放器在网页设计中有时候会用到, ...

  5. Gulp简介、gulp基本使用步骤、gulp-cli工具、gulpfile.js文件、gulp插件

    Gulp介绍: gulp概念: 基于node开发的前端构建工具模块,将前端机械化的操作编写成任务自动化操作,类似于webpack构建,可以完成代码压缩.语法转换.抽离公共文件.自动实现浏览器刷新等. ...

  6. Node.js:模块查找,引用及缓存机制

    1. Node.js的模块载入方式与机制 Node.js中模块可以通过文件路径或名字获取模块的引用.模块的引用会映射到一个js文件路径,除非它是一个Node内置模块.Node的内置模块公开了一些常用的 ...

  7. node mysql json_Node.js JSON模块用法实例分析

    本文实例讲述了Node.js JSON模块用法.分享给大家供大家参考,具体如下: 一.JSON.stringify语法: JSON.stringify(value [, replacer] [, sp ...

  8. JS前端调用TSC打印二维码、条码

    公司让用js调用TSC打印二维码,本人已调试成功,希望大家有所帮助! ActiveX下载地址:ActiveX下载地址! 实现代码:JS前端调用TSC打印二维码实现代码 <HTML> < ...

  9. CS模块与插件之间的参数传递

    CS 模块与插件之间的参数传递 2009 年9 月29 日 星期二 11:54 一.整型参数的传递 写一个模块, 功能是动态存储一些数据, 以供插件调用 给插件的接口为 : Get_user_info ...

最新文章

  1. C++ 类的大小计算
  2. mongodb 聚合 分组查询
  3. pack_padded_sequence 和 pad_packed_sequence
  4. python 装饰器分类_Python 装饰器(Decorators) 超详细分类实例
  5. jQuery的preventDefault()
  6. 用vue做项目的一些总结
  7. java hiveconf_Java学习路线分享hive的运行方式
  8. windows 打开exe传参_“以管理员身份运行”,这个打开软件时经常遇到的问题,有何含义...
  9. 5G 来袭,数据暴增,新一代云存储平台如何承载?
  10. ---PHP中的OOP--面对过程与面对对象基础概念与内容--(封装、继承、多态)...
  11. 安卓系统添加字体库和修改系统默认的字体
  12. 凯利公式和复利公式,与概率和时间为友
  13. 触摸屏是怎么控制PLC的?
  14. K、KB、M、MB、G、GB 、TB
  15. 虹科教您 | KPA Automation softPLC入门操作指南(1)
  16. 用sharesdk第三方等陆或分享到QQ空间,qq好友,微信,朋友圈,新浪微博,腾讯微博等
  17. 程序员的表白浪漫HTML生日礼物
  18. ArrayList集合类-学生信息管理
  19. 微信公众平台和开放平台的区别
  20. BP神经网络在双色球彩票上的预测实验及实现

热门文章

  1. Unity3D RPG角色扮演游戏源码(上下)-----源代码分析----01-----主角人物动画
  2. getchar 和 getch区别
  3. python内置函数入门_Python入门-内置函数一
  4. linux mmc驱动
  5. linux设置sfq队列参数,Linux内核中流量控制(5)
  6. 使用appium进行app自动化测试时遇到AppActivity设置正确但报Connect Appium Server Fail.A new session could not be created
  7. Mac自带的录屏功能
  8. 从ADK的WinPE自己手动构建自己的PE
  9. 【oracle】 字段属性为 date 的相关操作
  10. 3.css3深入,高级选择器浮动布局,html5/css3基础开始(推荐收藏)