《javascript语言精粹》里4.12节函数模块里的一个例子:
String.method('deentityify',function(){
var entity={
quot:'"',
lt:  '<',
gt:  '>'
};
        
          return function() {
        
          return this.replace(/&([^&;]+);/g,function(a,b) {
                var r=entity[b];
                return typeof r==='string'?r:a;
             }
  );
          };
}());
                
document.writeln('&lt;&quot;&gt;'.deentityify());
在firefox里一定会报错,我不知道为什么作者在给原型添加方法时要用object.method(name,func)这种形式,我把上面的例子改为:
String.prototype.deentityify=function(){
var entity={
quot:'"',
lt:  '<',
gt:  '>'
};
        
        return function() {
        
          return this.replace(/&([^&;]+);/g,function(a,b) {
                var r=entity[b];
                return typeof r==='string'?r:a;
             }
  );
};
};
                
document.writeln('&lt;&quot;&gt;'.deentityify());
结果输出的是:
function () { return this.replace(/&([^&;]+);/g, function (a, b) {var r = entity[b];return typeof r === "string" ? r : a;}); } 
明明返回的是个函数对象,怎么输出这么个结果?
我又试着将第8行的return function() { 和 第15行的};注释掉,然后运行得到了正确结果:<"> 。
不知道有没有高人指点一下这个程序的问题所在,还有书上表示希望利用函数作用域和闭包来使得只有deentityify方法有权访问entity这个数据对象。我不清楚如果将第8、15行注释掉,是否还能达到这个效果?另外,如果不能注释掉的话,这个程序应该怎么改?

解决方案 »

  1.   

    《javascript语言精粹》书里给原型添加方法一节里其实给Function.prototype.method定义了另外一种形式,即
    [align=center]Function.prototype.method = function (name, func) {
        this.prototype[name] = func;
        return this;
    };[/align]
    所以后面的例子都用了bject.method(name,func)这种形式,看来我看书还是没看仔细,其实细细推敲一番就清楚了,感谢webdeveloper.com论坛上的Fang点醒了我。