问题描述
|
我与另一位开发人员谈论过hasOwnProperty,以及您应该如何在javascript中的for-in循环中使用它,他有一个很好的问题。在进行for-in循环时,为什么toString,hasOwnProperty和其他内置方法不会出现在循环中?
解决方法
ECMAScript为对象(例如原型)中找到的每个属性定义了几个属性。其中之一是ѭ0these属性,如果将其设置为
false
,则将跳过该属性。
您实际上可以使用defineProperty
函数来操纵这些属性:
此方法允许精确添加或修改对象上的属性。通过分配添加常规属性会创建在属性枚举(for ... in循环)中显示的属性,其值可能会更改,并且可能会删除。此方法允许将这些额外的详细信息从其默认值更改。
, 根据规格
for ... in循环不会迭代
内置属性。这些包括所有
对象的内置方法,例如
字符串的indexOf方法或对象的
toString方法。但是,循环
将遍历所有用户定义的
属性(包括任何
覆盖内置属性)。
在Mozilla开发人员网络页面上for..in
它在内部基于这些属性的可枚举属性,您可以在EcmaScript规范中进行检查(搜索\“ for-in \”,\“ enumerable \”属性在第30页中进行了介绍)
, 我很确定这些方法的内部[[Enumerable]]属性设置为false
,但是在明确声明的地方我找不到任何东西。
更新:显然,规范中定义的属性的默认设置是不可枚举的(如果未另行指定)(请参见下面链接中的表7)。
您可以在规范中找到有关这些属性的更多信息:属性属性:
如果为true
,则该属性将通过for-in枚举进行枚举(请参见12.6.4)。否则,该属性被称为不可枚举。
, 内置属性不可枚举,因此toString
和hasOwnProperty
不可枚举。在ECMAScript 3中,每个用户定义的方法或属性都是可枚举的。在ECMAScript 5中,您可以选择方法或属性是否可枚举。
, 也许我误解了您的问题,但是这是hasOwnProperty在for-in循环内部工作的一个示例:
var i,o={some:\"thing\"};for(i in o)alert(o.hasOwnProperty(\"some\"));