4

如果我创建:

Object.prototype.count = function() {};
var m = {prop: 1};

for(var i in m)
    window.status += i + ", ";

在上面的代码i中包含也count继承了它的原型。现在我想知道是否有办法将自定义属性设置为标志 DontEnum(自定义属性不可设置),因此不会被枚举。

我知道我可以if(m.hasOwnProperty(i))只检查它的属性,但是如果我编写某种数组的 API,我应该告诉程序员记住这一点……这是不可接受的!

4

2 回答 2

4

实际上,Object 对象有一个属性“propertyIsEnumerable”,但它不是很有用。也许http://dhtmlkitchen.com/learn/js/enumeration/dontenum.jsp可以给你更多的洞察力?如果您按照这些章节进行操作,您最终会看到一个简单的问题“如何设置 DontEnum 属性”,回答更简单且非常令人失望:“你不能。” 幸好还有更多章节。你最终应该会看到一个包含有趣短语的页面:“好吧,好吧,IE 是垃圾,JavaScript 很烂,等等,等等……是时候停止抱怨并卷起袖子了。”。不过,本教程的底线是:“ JavaScript 中的可枚举性造成了一个严重的问题。”

于 2009-05-15T22:42:55.933 回答
3

从 JavaScript 1.8.5 开始,您可以使用 Object 方法defineProperty

Object.defineProperty (object, propertyName, attributes);

Whereattributes是一个地图,您可以在其中设置各种属性,例如valueenumerablewritable。如果属性存在,则修改它,否则创建它。

Juriy Zaytsev 构建了一个ECMAScript 5 兼容性表,您可以在其中找到支持的浏览器defineProperty(以及许多其他功能),尽管他忽略了 Safari 不支持definePropertyDOM 对象 - 与 IE 正好相反!!!:( -

编辑

Juriy 更新了表格。

于 2011-03-24T11:22:32.420 回答