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: 不知对你有没有帮助