了解Javascript __proto__等

时间:2014-09-16 15:33:42

标签: javascript arrays json prototype-programming

我改变了一个节点模块,它深入研究了我不了解的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。那是对的吗?它做的不止于此吗?如果是这样,为什么有人会这样做?

很抱歉这个问题很长,谢谢你的帮助。

0 个答案:

没有答案