何时不需要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
就可能是必要的是一种侵入性的坏习惯,任何可敬的框架都不可能做到“?
答案 0 :(得分:4)
恕我直言,在现代JS解释器中,它几乎[*]从不需要,特别是对于仅用作字典的普通对象。
没有它,jQuery管理得很好,因为人们已经知道不可靠地向Object.prototype
添加可枚举属性是一个坏主意。
当然,ES5允许您使用Object.prototype
向Object.defineProperty
添加不可枚举的属性。
[*]上面的例外情况是,如果您正在编写专门检查原型链的代码,并且确实需要知道是否继承了可枚举属性
答案 1 :(得分:3)
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")
代替。