new ActiveXObject() 和 WScript.CreateObject() 有什么区别?

Foa*_*oad 1 activex wsh jscript

根据Microsoft 文档,可以使用ActiveXObject()WScript.CreateObject()函数创建 COM 对象的实例。好像线条

var objXL = new ActiveXObject("Excel.Application");
Run Code Online (Sandbox Code Playgroud)

var objXL = WScript.CreateObject("Excel.Application");
Run Code Online (Sandbox Code Playgroud)

是相同的。这是一个真实的假设吗?如果不是,有什么区别?显示差异的示例将不胜感激。

PS这个被标记为重复的帖子是关于 VBScript 的CreateObject()方法和 JScript 的WScript.CreateObject(). 它回答提到了 JScript 的ActiveXObject()构造函数,没有进一步详细说明。

Lan*_*art 5

他们是一样的吗?

答案是肯定的,它们是相同的(从某种意义上说,它们执行实例化自动化对象的相同工作)。

基本上与具有全局函数的 VBScript 不同CreateObject(),在基于 ECMAScript 3rd Edition 的 JScript 中没有这样的等效项。因此,微软添加了自己的扩展ActiveXObject,它与CreateObject.

这两种语言都可以托管在 Windows 脚本宿主中,这使它们可以访问WScript.CreateObject()另一种方法,该方法执行完全相同的功能,但仅限于WScript仅通过 Windows 脚本宿主可用的对象上下文中。

跟进

关于它们是否相同存在一些争论,我仍然坚持我原来的答案它们是相同的。不过,我承认,我是比较的VBScriptCreateObject()和JScriptnew ActiveXObject()不是Wscript.CreateObject()(这是略有不同)。

让我们清楚一点,所有这些函数和对象都用于实例化自动化对象 (COM) 的相同目的。为了支持这一点,这是每个的官方描述;

WScript -CreateObject()方法

创建一个 COM 对象

JScript -ActiveXObject方法

启用并返回对自动化对象的引用

VBScript -CreateObject()函数

创建并返回对自动化对象的引用

如果它们完全相同,它们的意义何在?我们已经有了特定于语言的自动化实例化方法,那还有什么意义Wscript.CreateObject()呢?

不同之处在于,当使用第二个参数调用时,它允许您指定一个前缀,该前缀将用于区分该 COM 对象的事件处理程序。

这是从这个答案获取的一个示例,它显示了如何使用第二个参数来设置前缀objIE_,然后将其用于与该 COM 对象关联的任何事件处理程序的前缀,在本例中为InternetExplorer.Application对象。

// JScript
var objIE = WScript.CreateObject("InternetExplorer.Application","objIE_")
objIE.Visible = true

while (objIE.Visible){
    WScript.Sleep(500);
}

function objIE_NavigateComplete2(pDisp, URL){
    WScript.Echo("You just navigated to", URL)
} 

function objIE_OnQuit(){
    boolBrowserRunning = false ;
}
Run Code Online (Sandbox Code Playgroud)

它允许打开 Internet Explorer 实例并通过绑定事件导航到捕获的 URL,一旦 Internet Explorer 窗口关闭,脚本将结束。

因此,虽然不完全相同,但它们确实执行了实例化自动化 (COM) 对象的相同功能。


有用的链接

  • 不,因为“mshta.exe”是它自己的主机。“cscript.exe”和“wscript.exe”都允许使用“WScript”对象。但其他 WScript 对象(例如“WScript.Shell”)可能是这样,因为它们是通过“CreateObject()”和“new ActiveXObject()”实例化的。 (2认同)
  • 它实际上更像是一个对象实例而不是一个函数,因为它使用了“new”关键字。请注意[官方文档](https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/scripting-articles/7sw4ddf8(v=vs.84))如何调用它是“对象”而不是“函数”。 (2认同)
  • 如果有帮助的话,[这里有一个例子](/sf/answers/447951031/)。 (2认同)
  • 使用“new”意味着它是一个类的实例,因此在我看来,对象似乎是正确的。不管怎样,问题都已经得到解答了。 (2认同)