我改变了一个节点模块,它深入研究了我不了解的JS的一部分。不幸的是,很难找到解释这里发生的事情或者为什么有人会这样做的文档。
上下文:此代码从数据库获取json响应,该数据库可以有多种形式,并在返回之前进行一些操作。在这种特殊情况下,json响应具有属性" rows"包含一系列对象。 json响应也有一些属性,如" total_rows"提供有关db的附加信息。
if (json.rows) {
obj = json.rows.slice(0);
obj.__proto__ = new(Array);
if (json && typeof json === 'object') {
Object.keys(json).forEach(function (k) {
Object.defineProperty(obj.__proto__, k, {
value: json[k],
enumerable: false
});
});
}
}// elseifs for other forms of json
我试图理解这一点,这就是我想出的。请告诉我,我是否正确理解了这一点......
切片执行浅复制,创建一个新数组,实际上是json.rows中包含的数组。
我不知道__proto__ = new(Array)
的目的是什么。
然后,有一个不必要的检查,看看是否存在json(它必须通过if(json.rows)
)并检查json是否是一个对象(这是不必要的还是可能的它不仅仅是一个对象吗?它还有其他东西,还有json.rows吗?)。
然后,它遍历键并将它们作为属性添加到obj上。据我所知,这使得一个新的特殊数组对象具有可通过obj.propertyName访问的这些附加属性。
结果是一种新类型的数组,其中填充了json.rows的内容,这些内容也包含json中所有其他键的属性。这样,可以遍历数组,但也可以获取其他数据,如json.total_rows。
相反,如果json未经更改返回,则必须遍历json.rows,而不仅仅是json。那是对的吗?它做的不止于此吗?如果是这样,为什么有人会这样做?
很抱歉这个问题很长,谢谢你的帮助。