javascript – 是否可以模拟不可枚举的属性?

ES5有一个枚举标志。 Example

var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor
 , pd = getOwnPropertyDescriptor(Object.prototype, "toString");

assert(pd.enumerable === false, "enumerability has the wrong value");

部分实现

Partial implementation可以通过使用Object.keys和Object.getOwnPropertyNames使用填充的Object.defineProperty过滤掉新的非枚举属性来执行。

介绍

这允许属性是不可枚举的。这明显意味着Example

for (var key in {}) {
    assert(key !== "toString", "I should never print");
}

这允许我们添加属性来说Object.prototype(Example)

Object.defineProperty(Object.prototype, "toUpperCaseString", {
    value: function toUpperCaseString() {
        return this.toString().toUpperCase();
    },
    enumerable: false
});

for (var key in {}) {
    assert(key !== "toUpperCaseString", "I should never print");
}

console.log(({}).toUpperCaseString()); // "[OBJECT OBJECT]"

我们如何在非ES5兼容的浏览器中模拟?

Browser compat table

在这种情况下,我们关心潜在解决这个问题

> IE< 9(IE8仅适用于DOM对象)
> Firefox 3.6
> Safari 4
> Opera 11.5(Opera 11.6解决这个问题)。

ES5-shim没有这个解决方案。

ES5垫片有一个solution for most ES5 features that will break your code如果不工作。

有没有任何黑魔法,可以做与propiotory IE只有API?也许与VBScript?

最佳答案
你可以通过代码重写。重写每次使用for(p in o)body

for (p in o) {
  if (!(/^__notenum_/.test(p) || o['__notenum_' + p])) {
    body
  } 
}

然后可以通过定义__notenum _…属性来标记不可枚举的属性。为了兼容,你必须调整上面的内容,以确保__notenum_propname在与propname相同的原型级别被定义,如果你使用它们,重写eval和new Function来重写。

这基本上是ES5/3

转载注明原文:javascript – 是否可以模拟不可枚举的属性? - 代码日志