【问题标题】:Using htmlfile COM object to access the .getOwnPropertyDescriptor() method of an object in WSH JScript使用 htmlfile COM 对象访问 WSH JScript 中对象的 .getOwnPropertyDescriptor() 方法
【发布时间】:2021-03-20 07:13:53
【问题描述】:

this question的cmets中,有人告诉我.getOwnPropertyDescriptor()方法

在 ES3 中不受支持 ...,所以它可能在 JScript 中不受支持 [或者]

这确实是我在cscript.exe/wscript.exe 中尝试调用该方法时看到的:

对象不支持该属性或方法

但是,我正在使用的最新 JScript 版本是 5.812,根据 this document,该方法应该在 5.8* JScript 中可用。在this post 中也注意到了差异,指向another post,其中提供了使用htmlfile COM 对象的解决方法来访问Windows Script Host (WSH) JScript 中缺少的属性/方法。

我想知道是否可以使用相同的方法来访问上面的方法是WSH JScript。

比如代码应该是这样的

var object1 = {
  property1: 42
};

var htmlDoc = WScript.CreateObject('htmlfile');

// other code

var descriptor1 = <htmlfileObject>.getOwnPropertyDescriptor(object1, 'property1');
Wscript.StdOut.WriteLine(descriptor1.value);

提前感谢您的支持。

P.S.我在这里也标记了 VBScript,因为如果有人知道如何在 VBScript 中执行此操作,我们很可能可以轻松地将其转换为 JScript。

【问题讨论】:

  • 我不确定我们如何才能更清楚,但您不能在 JScript 中使用高于 ECMAScript 版本 3 的功能。 JScript 的 Active Scripting 版本的最后一次更新是在 IE9 中,它使用 ECMAScript 版本 3。在那之后,有一个基于不同引擎 (Chakra) 的版本与它并排放置,它牺牲了对 jsRT API 的 Active Scripting 功能的支持.您使用的 JScript 版本 5.8 于 2009 年 3 月发布,IE8 基于 ECMAScript 版本 3 的实现,是 JavaScript 版本 1.5 的等效版本。抱歉,您尝试做的事情无法完成。
  • 我了解您的argument here,但不支持。您在 IE 浏览器中实际使用的 JScript 版本取决于文档模式支持,请参见 Microsoft JScript ECMA-262-1999 ECMAScript Language Specification Standards Support Document 的第 8 页。
  • 所以要访问 JScript 5.8(包括第 5 版支持的 ECMA 扩展),您必须在 IE8 文档模式下运行浏览器。如果您想在 Windows Scripting Host 中使用它,那么您就不走运了,因为这些扩展只针对浏览器实现,而不是 WSH。不幸的是,JScript / VBScript / WSH 都是仍然“按原样”工作的遗留技术,但是当涉及到更现代的方法并试图支持它们时,就需要转向更现代的技术了。
  • 我很乐意承认我错了,在这种情况下我是Kul-tigin's answer proves。赞成。

标签: vbscript com jscript wsh ecmascript-3


【解决方案1】:

...但是,我使用的最新 JScript 版本是 5.812 和 ...

其实那是Windows Script Host的版本,而不是引擎JScript。

在 WSH 中,术语 JScript默认情况下只不过是与标准 ECMA-262 第 3 版兼容的 Microsoft JavaScript 引擎的别名/绰号。

除了默认引擎之外,您还可以通过指定引擎的 CLSID:1b7cd997-e5ff-4932-a7a6-2a9e636da385,将 Chakra 引擎(需要 Edge)与 WSH 一起使用。

测试引擎是否安装在计算机上的命令:

reg QUERY HKCR\CLSID\{1b7cd997-e5ff-4932-a7a6-2a9e636da385} /s

已安装 Chakra 的计算机上的示例输出:

HKEY_CLASSES_ROOT\CLSID\{1b7cd997-e5ff-4932-a7a6-2a9e636da385}
    (Default)    REG_SZ    JScript Language

HKEY_CLASSES_ROOT\CLSID\{1b7cd997-e5ff-4932-a7a6-2a9e636da385}\InprocServer32
    (Default)    REG_SZ    C:\Windows\System32\Chakra.dll
    ThreadingModel    REG_SZ    Both

test.js:

var object1 = {
  property1: 42
};

var descriptor1 = Object.getOwnPropertyDescriptor(object1, 'property1');

WScript.StdOut.WriteLine(descriptor1.value);

使用 Chakra 引擎运行 test.js 的命令:

cscript //NoLogo //E:{1b7cd997-e5ff-4932-a7a6-2a9e636da385} test.js

示例输出:

42

【讨论】:

  • 这对我来说是新事物,没有意识到可以从 WSH 运行 Chakra。一如既往的出色回答。
  • @Lankymart 谢谢。正如您可能猜到的那样,它没有记录在案,我也不认为它受到鼓励。根据我的经验,我可以说可以根据 OP 的需要将它与 Windows 脚本一起使用,但尝试将它与 ASP Classic 一起使用绝对不是一个好主意,因为该引擎中没有实现许多 ASP 接口。我试过了,效果不好¯_(ツ)_/¯
  • 我猜它在 HTA 中不起作用,因为引擎是由文档模式而不是引擎开关决定的?
  • @Lankymart 我同意。此外,即使我们设法在 HTA 中运行它,我也不确定所有必需的命名空间、对象(窗口、文档等)和事件是否正常工作,就像在 ASP Classic 中一样。
  • 是否也可以使用IE的引擎Trident/MSHTML?我还找不到“.dll”和 CLSID。
猜你喜欢
  • 2010-12-11
  • 2012-10-14
  • 1970-01-01
  • 2011-05-29
  • 2010-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
相关资源
最近更新 更多