4

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

function Item() {
    ...
}

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

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

2 回答 2

5

您正在定义属性 onItem而不是 on Item.prototype

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

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

这将隐式设置enumerable:false,以及falseforconfigurablewritable

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
});
于 2012-04-20T13:37:07.900 回答
1

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

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

于 2012-04-20T13:37:23.653 回答