javascript – 使属性不可枚举有什么好处?

枚举性是属性的三个属性之一:可写性,枚举性和可配置性。我的问题是:

>在JavaScript中使属性不可枚举的好处是什么?我知道我们通过使它们不可枚举来隐藏财产,但是财产隐藏的好处是什么?
>我们可以访问非枚举属性吗?如果是,那么使它们不可枚举的好处是什么?
>将对象的所有预定义属性设置为不可枚举?比如Array的pop和push属性是不可枚举的?

我认为主要的好处是能够控制枚举对象的属性时显示什么,例如for或Object.keys()。

MDN使用Object.defineProperty:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty解释得很好

因此,通常,当人们想要向Object添加一个方法时,例如对于旧浏览器不支持的某些方法的polyfill,他们修改.prototype。但这使得属性枚举和混乱返回在loops / keys集合(不使用.hasOwnProperty …不是每个人都使用)。

所以,而不是像:

Object.prototype.myMethod = function () {
    alert("Ahh");
};

你可以使用Object.defineProperty来显式地说它不是可枚举的:

Object.defineProperty(Object.prototype, 'myMethod', {
    value: function () {
        alert("Ahh");
    },
    enumerable: false
});

这样,例如当你使用for(var key in obj),“myMethod”不会是一个枚举的项目,你不必担心使用.hasOwnProperty。主要的问题是,一些浏览器不支持它当然:http://kangax.github.com/es5-compat-table/,并不是所有的库/代码使用它,所以你不能总是依赖外部库/代码来正确地使用和所有的时间。

你可以随时访问一个不可枚举的属性,它只是枚举对象的属性时不会显示 – 这是主要观点。

我确信对象的所有“预定义”属性是不可枚举的。通过这个,我真的只是意味着本地属性,不一定继承或创建。所以在你的例子中,pop和push不会被枚举,但是Array.prototype.indexOf将是如果它在一个旧的浏览器上创建一个polyfill不支持该方法…当然,可以避免通过使用Object.defineProperty像我上面的例子。另一个例子是length属性,它不是枚举的。

这里有一个例子:http://jsfiddle.net/aHJ3g/

Object.keys的使用和定义很重要:“返回一个给定对象自己的可枚举属性的数组,与for-in循环提供的顺序相同(不同之处在于for-in循环枚举了原型链)。 – 从MDN – https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/keys

http://stackoverflow.com/questions/14984533/what-are-the-benefits-of-making-properties-non-enumerable

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:javascript – 使属性不可枚举有什么好处?