【问题标题】:javascript property non enumerable still found by for... injavascript 属性不可枚举仍然由 for... in
【发布时间】:2012-05-02 02:30:01
【问题描述】:

我正在编写一个小的 javascript 库:我定义了一个 Item 对象,然后使用 Item.prototype.addNumber 添加了一个函数,最后我将其设置为不可枚举,但如果我尝试使用 @987654323 记录 Item 的方法@loop 函数仍然出现。 这是我的代码,我做错了吗? (在 Chrome 18 和 Firefox 11 上测试)

function Item() {
    ...
}

Item.prototype.addString= function() {
    ...
}

Object.defineProperty(Item, "addString", { enumerable: false });

【问题讨论】:

    标签: javascript enumerable


    【解决方案1】:

    您是在 Item 而不是 Item.prototype 上定义属性。

    Object.defineProperty(Item.prototype, "addString", { enumerable: false });
    

    如果您使用Object.defineProperty最初addString 添加到Item.prototype,那么您可以显式地(或隐式地)同时设置属性描述符...

    这将为configurablewritable 隐式设置enumerable:false 以及false

    Object.defineProperty(Item.prototype, "addString", { 
        value: function() {
            ...
        }
    });
    

    或者,如果您只希望 enumerable 成为 false,您可以这样做...

    Object.defineProperty(Item.prototype, "addString", { 
        value: function() {
            ...
        },
        configurable: true,
        writable: true
    //  ,enumerable: false  // uncomment to be explicit, though not necessary
    });
    

    【讨论】:

    • 但是默认不是false吗?看看我的回答中的引用。而且我在 MDN 文章中完全没有看到*.prototype
    • @gdoron:做Item.prototype.addString = func...默认是可枚举的,所以Object.defineProperty用来设置可枚举的设置。如果Item.prototype.addString 属性最初是使用defineProperty 创建的,那么是的,它是不可枚举的。
    • 哦,那你能用这个代替吗:Object.defineProperty(Item.prototype, "addString", { }); ?
    • @gdoron:有点。如果您最初使用它来定义属性的值,则需要使用第三个参数的value: func...。我会更新的。
    • @gdoron:是的,当我使用 SO 作为资源时,我对投票的关注与对绿色检查的关注一样多。我认为提问者比任何人都更受选票的影响,所以很多选票可能会导致绿色检查。你是对的......它并不完美。
    【解决方案2】:

    您在Object(不可枚举的)上直接定义一个属性(addString),在Item 的原型上定义另一个addString(默认为可枚举)。

    for ( in ) 迭代原型链上的属性,这就是它出现在那里的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-03
      • 1970-01-01
      • 2013-05-18
      • 1970-01-01
      • 2012-02-23
      • 1970-01-01
      • 2021-08-08
      • 1970-01-01
      相关资源
      最近更新 更多