什么时候不需要`hasOwnProperty`?

时间:2017-01-08 23:58:38

标签: javascript hasownproperty

何时不需要hasOwnProperty

本书 JavaScript:好的部分包括以下内容:“通常是必要的”:

  

另一种形式(称为for in)枚举对象的属性名称(或键)。   在每次迭代中,将对象中的另一个属性名称字符串分配给   可变

     

通常需要测试对象hasOwnProperty( 变量 )以确定是否   属性名称确实是对象的成员,或者在原型上找到   链

for (myvar in obj) {
 if (obj.hasOwnProperty(myvar)) {
 ...
 }
}

更具体地说,我想枚举一个简单的类字体对象的属性,该对象是使用Javsacript对象文字语法创建的,例如:

var foo = { 'bar': 'baz' };

或使用JSON.parse创建的类似对象:

var foo = JSON.parse("{ 'bar': 'baz' }");

我在hasOwnProperty对象上for in时应该使用foo吗?

假设此javascript作为复杂网页的一部分在随机浏览器中运行。

答案是,“在实践中,它可能/通常没有必要。理论上,如果某个框架或库通过更改Object.prototype添加了属性,但是更改Object.prototype就可能是必要的是一种侵入性的坏习惯,任何可敬的框架都不可能做到“?

3 个答案:

答案 0 :(得分:4)

恕我直言,在现代JS解释器中,它几乎[*]从不需要,特别是对于仅用作字典的普通对象。

没有它,jQuery管理得很好,因为人们已经知道不可靠地向Object.prototype添加可枚举属性是一个坏主意。

当然,ES5允许您使用Object.prototypeObject.defineProperty添加不可枚举的属性。

[*]上面的例外情况是,如果您正在编写专门检查原型链的代码,并且确实需要知道是否继承了可枚举属性

答案 1 :(得分:3)

在一个理智的,现代化的环境中迭代普通对象 2 时不需要

hasOwnProperty&lt; 1 < / sup>:这种假设意味着限制遗留浏览器支持。

所有标准Object属性在很长一段时间内都是不可枚举的,并且新的核心方法一直是不可枚举的。

1 如果代码决定添加到Object.prototype,除了polyfill之外它还有问题,它应该将它添加为非可枚举属性。添加新的可枚举属性违反了#34;理智的环境&#34;约束。 IE 9+(和FF / Chrome / Safari等)支持Object.defineProperty足以完成此任务。 IE 8不会违反&#34;现代&#34;约束。

2 数组不符合普通对象的条件。对于大多数数组迭代,使用for..in也是不明智的。

答案 2 :(得分:0)

仅在绝对可预测的情况下才需要,这意味着-几乎不需要。

在ECMAScript 5.1中,添加了Object.create,从而可以创建 具有指定[[Prototype]]的对象。 Object.create(null)是一个 用于创建将用作地图的对象的通用模式。这个 当假定对象将具有 Object.prototype中的属性。这条规则可以防止 Object.prototype个直接来自对象的方法。

此外,对象可以具有遮盖内置对象的属性。 Object.prototype,可能导致意外行为或 拒绝服务安全漏洞。例如,它将是 对于Web服务器来说,解析来自客户端的JSON输入并进行调用是不安全的 hasOwnProperty直接在生成的对象上,因为恶意 客户端可以发送诸如{"hasOwnProperty": 1}之类的JSON值,并导致 服务器崩溃。

为避免此类细微的错误,最好始终调用这些错误 Object.prototype中的方法。例如,foo.hasOwnProperty("bar") 应该用Object.prototype.hasOwnProperty.call(foo, "bar")代替。