我希望为ActiveX对象创建一个Javascript库,实现可链接性。
例如,我希望将其替换为:
var dbEngine=new ActiveXObject('DAO.DBEngine.36');
var dbs=dbEngine.OpenDatabase('D:\\Todo.mdb');
var rs=dbs.OpenRecordset('SELECT * FROM ListItems');
用这样的东西(la jQuery):
var rs=AX('DAO.DBEngine.36')
.OpenDatabase('D:\\Todo.mdb')
.OpenRecordset('SELECT * FROM ListItems');
我知道我可以这样做:
var rs=new ActiveXObject('DAO.DBEngine.36')
.OpenDatabase('D:\\Todo.mdb')
.OpenRecordset('SELECT * FROM ListItems');
但我无法从Recordset对象访问Database对象。
为了做到这一点,AX函数应在内部创建DBEngine对象并检查其成员/属性,然后在返回的对象上公开相应的方法。
如果member / property返回一个对象,那么该对象本身将被包装在AX函数中。
答案 0 :(得分:1)
只能在运行时检查实现IDispatchEx的对象。 MSDN专门列出了IDispatch和IDispatchEx之间的差异:
开发IDispatchEx是为了提供 IDispatch的所有服务 作为一些扩展 适合更有活力 后期语言,如脚本 语言。的附加功能 IDispatchEx超出了那些提供的 IDispatch是:
向对象添加新成员 ( “EXPANDO”)。
删除对象的成员。
区分大小写的调度操作。
使用隐式搜索成员 名。
枚举对象的DISPID 。
从DISPID映射到元素名称。
获取对象的属性 成员。
使用此方法调用 指针。
允许支持的浏览器 获取名称空间的概念 命名空间父对象。
我大胆地提出了相关问题。
正如Eric在评论中指出的那样,你可以使用foreach枚举对象的成员(或者......或者......),但是我不确定,从这个问题来看,你特别想做什么
由于并非所有ActiveX控件都会实现IDispatchEx(或者可能无法正确或完全实现IDispatchEx的所有方法),您是否需要使用特定控件?
更多细节将带来更好的答案。