微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – hasOwnProperty何时使用,何时不需要?

建议始终使用hasOwnProperty,但在许多情况下不需要这样做.
例如,请考虑以下代码
var object = JSON.parse(somejsontext);
for(var prop in object) {
   console.log(object[prop]);
}

我知道在这种情况下,prop是对象的一部分,它是由for..in定义的.

但根据MOZ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty,我们应该使用它来避免迭代不可摧毁的道具,这个例子如下:

var buz = {
  fog: 'stack'
};

for (var name in buz) {
  if (buz.hasOwnProperty(name)) {
    console.log('this is fog (' + name + ') for sure. Value: ' + buz[name]);
  }
  else {
    console.log(name); // toString or something else
  }
}

但实际上测试这个代码,永远不会去其他地方.

那么什么时候有意义使用hasOwnProperty?

更新:考虑到选择的答案,我们可以安全地避免在这种情况下使用hasOwnProperty:
– 对象js尚未被任何JavaScript库或我们的代码扩展
– 对象是我们可以控制的简单代码

解决方法

当原型包含您的代码未预料到的可枚举属性时,就会出现问题.例如,假设这在您的示例之前运行:
Object.prototype.foobar = "hello";

在这种情况下,迭代buz将包括可枚举的foobar原型属性.这个hasOwnProperty模式允许您的代码区分直接在对象上的属性,以及从原型祖先继承的属性.

问题不在于“枚举不可枚举的属性”(根据定义,这是不可能的,除非您通过getownPropertyNames为原型层次结构的每个级别显式获取它们),而是枚举继承的属性.当使用可以向高级原型添加可枚举属性的库时,这是一个问题,正如我上面所说明的那样.

如果要在不导致枚举该属性的情况下向原型添加属性,可以使用Object.defineProperty创建不可枚举的属性

Object.defineProperty(Object.prototype,"foobar",{
    value: "hello",enumerable: false,writeable: true,configurable: true
});

这样的属性不会出现在buz上的for..in循环中(或直接在Object.prototype上的for..in循环中).

原文地址:https://www.jb51.cc/js/150379.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐