Hash类型 与 toQueryString()方法 新人遇到的问题,请帮忙


function testHash()

{

var a ={
"百度" :"http://www.baidu.com/",
"Google" :"http://www.google.com/",
"微软" :"http://www.microsoft.com/",
"博客园" :"http://www.cnblogs.com/",
"阿舜的博客" :"http://ashun.cmblogs.com/"
};

          alert(a.toQueryString());//错误
          //var h = $H(a);  
          //alert(h.toQueryString()); //正确 displays: first=10&second=20&third=30 
   } 

以上是网上的一个例子,请问1.调用toQueryString()方法的对象必须是Hash类型的么? 2.如果必须是Hash类型,那么a 为什么不是Hash类型? 请说具体点儿 谢谢了!

[quote]
那么a 为什么不是Hash类型?
[/quote]

a是JS中的Object对象

而Hash是Prototype里新创建的类,需要通过 new Hash()进行实例化

虽然,你可以将{}、Object理解成 hashMap,但在js他不叫Hash,而是Object,

Hash是Prototype扩展的类

1。toQueryString方法在Prototype中有许多类都有此方法,但本质上都是调用了Hash类的toQueryString方法,所以,Hash类是具体实现toQueryString方法的

2。你应该混淆了一个问题,toQueryString是Prototype里实现的一个方法,不是说你引用Prototype.js,然后你的对象就可以直接使用toQueryString方法。
其实,如果你不想 用$H转化的话,你可以 这样 写 alert(Object.toQueryString(a));

在Prototype 1.6版本中是这样的。。。。

其实本质是这样的:
引用 Prototype.js后, function可以直接使用bind方法,因为Prototype重写了Function.prototype,在里面添加了bind方法,其实你也可以加上自己的实现比如:
[code="js"]
Function.prototype.deadCall = function(){
while(true) {
this(arguments);
}
}

function testF(){window.deadStr+="dead..."}
testF.deadCall();
[/code]

但是,toQueryString没有加到 Object.prototype中,只加到 Object中,所以你就不能直接运行 {....}.toQueryString方法。

再深入一点是这样,
Function、Object是js的原始类型
当你声明一个方法或创建一个对象的话

[code="js"]
function f(){}
var o = {};
var o1 = new Object();
[/code]
都是实例化一个Function或Object对象,实例化后的对象,能直接拥有原始类型的prototype中的属性,所以,可以添加Funciton.prototype.deadCall 属性,声明后的方法就直接调用了。

那Protoype为什么不直接添加 Object.prototype.toQueryString 属性呢?
因为:重写JS原始类型的Prototype添加一些有用的方法属性,虽然可以方便我们编写代码,但 应该清楚的认识到,这其实是一种污染,由其是Object这个特殊的原始类型,因为其使用频繁,操作灵活、经常要遍历,所以污染对它的影响就大很多,可能会影响性能,放值时覆盖、取值时多取。。。等问题
所以,就Object没有加。而Function就可以加工一下。

表达能力有限。。 :oops: 不知对你有没有帮助