在 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 的提案。
对象构造函数在过去的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 的提案。