为什么Object.keys()没有添加到Object.prototype?

其中 hasOwnProperty() 使用的最频繁一些,于是今年的规范刚加上了 Object.hasOwn() 来替代它。
具体哪里不好?首先就是用 Object.create(null) 创建的无原型对象没法使用这些方法。
而且对象自己身上可能有个同名属性,比如: {hasOwnProperty: 1}。当然这个可能性对这三个方法来说比较小,因为名字比较特殊,但假如是 keys,values 这样的名字,那冲突的概率很大,比如:
var obj = {keys: [1, 2, 3]}
obj.keys() // 就报错了
而且制定 ES5 的时候还要考虑 ES3 环境的 polyfill,如果 polyfill 的代码写上一句 Object.prototype.keys = function()...,那么所有对象的 for-in 遍历都会多出一个 keys 属性,因为 ES3 里没办法让一个属性不可枚举。
还有另外一个兼容性问题,那就是 with 语句,假如之前有这么一行代码:
var values = [1, 2, 3]
var obj = {}
with (obj) {
alert(values)
}
如果 Object.prototype 上突然有了个 values 方法,那么这个代码运行就错了,with 块里就拿不到外层的 values 变量了。这个问题在 ES6 里扩展 Array.prototype 时也考虑到了,于是增加了一个 hack 逻辑,那就是 with 语句要忽略掉 obj[Symbol.unscopables] 上的那些属性,假装他们不存在,这样就能保持拿到外层作用域的变量。你可以看看 Array.prototype[Symbol.unscopables] 有些啥:

作者:紫云飞 链接:https://www.zhihu.com/question/544437076/answer/2585460855
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!