为什么Object.groupBy() 返回的对象中hasOwnProperty不是一个函数?
我一直在深入研究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 方法返回所谓的 空原型对象1。hasOwnProperty 是 Object.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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。