You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JScript(ES3,VBA中ScriptControl ActiveX)是否支持不可枚举参数及枚举问题

关于VBA ScriptControl中JScript(ES3)不可枚举属性的问题

问题1:是否支持不可枚举属性?

答案是肯定的——VBA里的ScriptControl所用的JScript引擎(基于ES3的微软JScript)支持不可枚举属性,但你得用正确的方式设置,不是你现在尝试的这种操作。

问题2:为什么设置dontEnum = true后for..in仍会枚举到doFunc?

你这里踩了一个典型的误区:你给doFunc这个函数对象本身加了个dontEnum属性,但这完全不是标记Object.prototype上的doFunc属性为不可枚举的正确方法。

简单来说,dontEnum是属性的内部特性,不是属性值(这里就是那个函数)的普通属性。你现在的操作只是给函数本身加了个无关的属性,和Object.prototype上的doFunc是否会被枚举没有半毛钱关系。

那正确的做法是什么?分两种情况:

  • 如果你的ScriptControl用的是较新的JScript版本(对应IE8及以上,JScript 5.8+),可以用ES5的Object.defineProperty(微软提前做了支持):
    Object.defineProperty(Object.prototype, 'doFunc', {
        value: function(){ return 'this is ' + this; },
        enumerable: false, // 关键:设置为不可枚举
        writable: true,
        configurable: true
    });
    
  • 如果是老版本的JScript(比如IE6/7的版本),只能用非标准的__defineGetter__方法,通过定义访问器属性来实现不可枚举(JScript中这种方式定义的属性默认不可枚举):
    Object.prototype.__defineGetter__('doFunc', function() {
        return function(){ return 'this is ' + this; };
    });
    

用上面两种方式定义后,你再用for..in枚举对象时,doFunc就不会出现在结果里,同时调用obj.propertyIsEnumerable('doFunc')也会返回false,完全符合你的预期。

内容的提问来源于stack exchange,提问作者Sairam Simha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:07:56