【问题标题】:What is the technical reasons behind omitting new Object methods from object prototye in javascript? [duplicate]在javascript中从对象原型中吐出新的对象方法背后的技术原因是什么? [复制]
【发布时间】:2022-01-06 16:36:32
【问题描述】:

对象构造函数在过去的js更新中得到了几个方法,如apply、assign、entry、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 仍然可以正常工作)。

采取了其他路线,一定有技术原因。我很好奇它是什么。

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

【问题讨论】:

  • 在这篇文章中根本没有看到任何与调试代码相关的问题。你确定你不是想在softwareengineering.stackexchange.com 上发布这个吗?
  • @Tibrogargan 并非所有问题都需要与调试代码相关。
  • 有趣的是,即将发布的 JavaScript 规范引入了 Object.hasOwn(obj, key) 作为 obj.hasOwnProperty(key) 的更有用的替代品,原因解释为 here
  • 但是,它们确实需要关注主题,请参阅stackoverflow.com/help/on-topic。 @Unmitigated
  • 您考虑过您的obligations before asking 吗?你没有提到 TC-39 委员会,这些事情是在哪里讨论和决定的,正如你所说的“背后的技术原因......”。

标签: javascript ecmascript-6


【解决方案1】:

除了 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.hasOwnexplicitly mentions this aspect的提案。

【讨论】:

  • 仅你的例子就值得提出这个问题(尽管它通常会产生仇恨)。我学到了一些新东西。
【解决方案2】:

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

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

【讨论】:

  • 请提供参考资料。
  • @Tibrogargan OP 询问“有没有上述方法会失败的例子?”,这个答案提供了一个明确的答案。不确定您需要什么样的参考,values is not a function 类型错误的屏幕截图?
  • OP 询问技术原因是什么。您给出的可能是原因,但除非您是发布规范的工作组的成员,否则这只是您的意见。可能还有其他同样有效的。你有实际的参考吗?
  • @Tibrogargan 我的回答只包含事实,而不是意见。
  • 您的答案中没有任何不正确的地方,但是除非您可以指出一些参考资料最终表明这些可能是也可能不是 Object 规范中省略原型的原因。这个问题本身不属于这个网站,纯粹是因为它是基于意见的。您的回答提供了很好的解释,但它回答的问题不属于这里。
猜你喜欢
  • 2021-10-11
  • 1970-01-01
  • 2010-11-03
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
  • 1970-01-01
  • 2013-05-23
  • 1970-01-01
相关资源
最近更新 更多