蓝狮注册开户为什么Object.keys()没有添加到Object.prototype?

因为当时已经意识到了在 Object.prototype 上放置方法是不好的,最主要的就是兼容性问题。在 ES1 之后,只有 ES3 里给 Object.prototype 扩展了三个方法,而且后面也证明是不好的,ESLint 里有个 no-prototype-builtins 规则来禁用它们:

其中 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] 有些啥:

0 Comments
Leave a Reply