为什么犀牛书的ajax post函数要对post的数据先encodeFormData呢?

在犀牛书的第20章中的post函数如下:
[code="js"]
HTTP.post = function(url, values, callback, errorHandler)
{
var request = HTTP.newRequest();
request.onreadystatechange = function()
{
if (request.readyState == 4)
{
if (request.status == 200)
{
callback(HTTP._getResponse(request));
}
else
{
if (errorHandler)
{
errorHandler(request.status, request.statusText);
}
else
{
callback(null);
}
}
}
};

request.open("POST", url);
request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
request.send(HTTP.encodeFormData(values));

};

HTTP.encodeFormData = function(data)
{
var pairs = [];
var regexp = /%20/g;

for (var name in data)
{
var value = data[name].toString();
var pair = encodeURIComponent(name).replace(regexp, "+") + "=" +
    encodeURIComponent(value).replace(regexp, "+");
pairs.push(pair);
}
return pairs.join("&");

};
[/code]
这样子每次post的数据都要写成一个类才可以,比如测试用例是:
[quote]
function callback_test(obj)
{
alert(obj);
}

var post_data = {'class':1, 'name':'oo'};
HTTP.post('/z.php', post_data, callback_test, null);
[/quote]

个人觉得把encodeFormData去掉,直接写成"name=oo&class=1"不是更方便吗?
谢谢:)
[b]问题补充:[/b]
encodeURIComponent可以对中文进行编码这个我知道,但是搞不懂作者为什么要写成post_data = {'class':1, 'name':'oo'}; 的形式,我觉得如果从一下url的参数里面提取出成一个类不就更麻烦?
比如读者可以调用
ajax.send_request('class=1&name="oo"', "post");
而ajax.send_request()的原型是
ajax.send_request(data, Method);
这样不知道有没有现成的函数把'class=1&name="oo"'转换成:
{'class':1, 'name':'oo'};
呢?
谢谢
[b]问题补充:[/b]
谢谢,呵呵,我也越来越感受到犀牛书的价值了。
刚刚写了个个函数对uri进行转换的,献丑一下。
[code="js"]
function uri2json(uri)
{
var tmp_uris = uri.split("&");
var json_str = 'uri_obj={'
for (i = 0; i < tmp_uris.length; i++)
{
tmp_uri = tmp_uris[i].split('=');
json_str += tmp_uri[0] + ':"' + tmp_uri[1] + '",';
}
json_str += '}';
eval(json_str);
return uri_obj;
}
[/code]
测试用例是
[quote]
var str = "a=1&b=2&c=kaka&d=tw22";
alert(uri2json(str).c);
[/quote]

没有现成的函数把'class=1&name="oo"'转换成:
{'class':1, 'name':'oo'};

这就是讲究写js框架的设计了

写成{'class':1, 'name':'oo'}; 这种形式是非常的能用,把参数封装成一个JSON格式的对象,由框架内部也就是encodeFormData来解析生成参数串,多好的设计,

你觉得直接写成"name=oo&class=1"方便,是方便,但没点可重用性,你是站在一个人写代码的角度来看这个问题,这部分完全可以提取出来作为一个通用的方法也就是encodeFormData,从这点上就看来js权威指南这本书的价值!!!

这个encodeURIComponent方法是为了为中文等一些字符编码的

如果post_data里而的属性比较多的情况呢,那样name=oo&class=1&....."不是要写很久,而encodeFormData函数里不是有for (var name in data) 这样post_data属性较多的时候可以进行遍历.而且还有encodeURIComponent方法进行编码.

[code="java"]{'class':1, 'name':'oo'}[/code]
这是JSON格式的对象,这样比较符合面向对象的观点吧..

[code="java"]把'class=1&name="oo"'转换成:
{'class':1, 'name':'oo'}; [/code]
现成函数不知道..不过这个可以自己写一个....