为什么Object.groupBy() 返回的对象中hasOwnProperty不是一个函数?

前端开发 2026-07-11

我一直在深入研究JS Object API,想再多学点东西,结果发现了一些关于 groupBy() 的工作方式时我并没有真正预料到的东西。下面是一个小例子:

const people = [
    { name: "Ana", role: "dev" },
    { name: "Ben", role: "dev" },
    { name: "Cara", role: "pm" },
];

const grouped = Object.groupBy(people, (person) => person.role);

console.log(grouped);
// seems fine

console.log(grouped.hasOwnProperty("dev"));
// TypeError: grouped.hasOwnProperty is not a function

我自然以为 grouped.hasOwnProperty("dev") 只是一个普通对象,但让我吃惊的是,发现 hasOwnProperty 缺失。

这种设计选择背后的想法是什么?我知道这很可能是因为它没有从 Object.prototype 继承,但在 groupBy() 的情况下,为什么这被认为比从 Object.prototype 继承的实现更好?

解决方案

groupBy 方法返回所谓的 空原型对象1hasOwnPropertyObject.prototype 的一种方法。一个空原型对象既没有原型也没有构造函数。因此 hasOwnproperty 不适用于返回值。

1 使用 Object.create(null, [someObject]) 获得的对象

不过你也可以改用静态方法 Object.hasOwn

const people = [
    { name: "Ana", role: "dev" },
    { name: "Ben", role: "dev" },
    { name: "Cara", role: "pm" },
];

const grouped = Object.groupBy(people, (person) => person.role);
console.log(Object.hasOwn(grouped, "dev"));

关于为什么要这样选择的问题:对于 groupBy,人们希望避免原型污染,返回一个干净的键值对存储,不带任何继承的值。这也能防止恶意代码试图覆盖 Object.prototype


因此,在 const items = [ { cat: 'toString', value: 1 }, { cat: 'hasOwnProperty', value: 2 } ]; const grouped = Object.groupBy(items, item => item.cat); 的情况下,grouped.hasOwnProperty 指的是分组后的项,而不是 Object.prototype.hasOwnProperty

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章