- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
可枚举性是属性的三个属性之一:可写性、可枚举性和可配置性。我的问题是:
pop
和 push
属性是不可枚举的情况?最佳答案
我认为主要的好处是能够控制在枚举对象的属性时显示的内容,例如 for in
或 Object.keys()
.
MDN 用 Object.defineProperty
解释得很好: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty
所以通常情况下,当人们想要向 Object
添加方法时,例如旧浏览器不支持的某些方法的 polyfill,他们修改了 .prototype
.但这使得该属性可枚举并弄乱了循环/键集合中返回的内容(不使用 .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
循环也枚举原型(prototype)链中的属性)。” - 来自 MDN - https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/keys
关于javascript - 使属性不可枚举有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14984533/
我是一名优秀的程序员,十分优秀!