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循环中).

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...