gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 03:05:30 25 4
gpt4 key购买 nike

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

  • 在 JavaScript 中使属性不可枚举有什么好处?我知道我们通过使属性不可枚举来隐藏属性,但是隐藏属性有什么好处?
  • 我们可以访问不可枚举的属性吗?如果是,那么使它们不可枚举有什么好处?
  • 是否所有对象的预定义属性都设置为不可枚举?例如 Array 的 poppush 属性是不可枚举的情况?

最佳答案

我认为主要的好处是能够控制在枚举对象的属性时显示的内容,例如 for inObject.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/并且并非所有库/代码都使用它,因此您不能始终依赖外部库/代码来正确使用它。

您可以随时访问不可枚举的属性,它只是在枚举对象的属性时不会显示 - 这是重点。

而且我确实相信对象的所有“预定义”属性都是不可枚举的。就此而言,我真的只是指原生属性,不一定是继承或创建的。因此,对于您的示例,poppush被枚举,但是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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com