在 javascript 中从对象原型中吐出新对象方法背后的技术原因是什么?

What is the technical reasons behind omitting new Object methods from object prototye in javascript?

对象构造函数在过去的js更新中有几个方法,如apply、assign、entries、fromEntries、keys、values...

这些将是包含在对象原型中的优秀候选对象。

Object.prototype.values = function(f) {
    return Object.values(this)
}

我们甚至可以组合它们来实现映射或过滤器:

Object.prototype.map = function(f) {
    return Object.fromEntries(Object.entries(this).map(f))
}

// now we could do...
obj1 = {a:1, b:2}
obj1.values() // [1,2]
obj1.map([a,b] => ['x'+a: b+1]) // {xa:2, xb:3}

与例如

相比,这种语法无疑更胜一筹
Object.fromEntries(Object.entries(obj1).map([a,b] => ['x'+a: b+1])))

但甚至

obj1.entries()
    .map([a,b]=>['x'+a: b+1])
    .fromEntries()

更具可读性。

向后兼容性似乎不是问题,因为原型链中的更多对象会掩盖这些方法(例如 Array.prototype.map 仍然可以正常工作)。

走的是其他路线,肯定有技术原因。我很好奇它是什么。

是否有上述方法失败的示例(可能在遗留代码中)?

所有对象的额外属性太多是有问题的,因为将这些名称用作对象的常规键会很困难或令人困惑。

例如,values 是对象上的有效键名,例如{values: [1,2,3]}。在问题的例子中,如果这个 属性 可以被修改,那么在一个对象上调用 .values() 并不总是有效。如果这个 属性 是不可配置的,那么就不可能使用 values 作为常规键名,这是不可取的。

添加到 Unmititgated 已经声明的内容,将这些方法添加到原型将使它们在从 null 创建的对象上不可用,而在新引入的对象方法上不应该是这种情况。

Object.prototype.values = function() {
    return Object.values(this)
}

let obj = Object.create(null);
obj.name = "Peter";
obj.age = 34;

console.log(Object.values(obj)); // works

console.log(obj.values()); // error

Object.hasOwn explicitly mentions this aspect 的提案。