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
相关产品推荐
相关产品推荐

