论坛首页 Web前端技术论坛

Prototype的Object.extend的问题,无法扩展toString方法。

浏览 3671 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-05-25  
我的代码如下
var myClass = Class.create();

Object.extend(myClass.prototype, {
    initialize : function () {},
    
    toString : function () {
        return "myClass";
    }
});

var mc = new myClass();

alert(mc);


myClass并没有获得我定义的toString的方法,myClass实际继承的可能
还是Object的toString方法,可以通过alert(mc.toString);来测试,
如果返回的是native 就是系统默认的toString。

有人知道如何解决吗???
   发表时间:2007-05-25  
的确有这个问题,刚才测试了一下,在firefox中是正确覆盖了的,但是ie就没有,奇怪……
0 请登录后投票
   发表时间:2007-05-25  
可能你的类定义方式有问题,改为如下代码就正常了:
js 代码
 
  1. var myClass = Class.create();     
  2.   
  3. myClass.prototype = {    
  4.      initialize : function () {  
  5.      },    
  6.      toString : function () {    
  7.          return "myClass";    
  8.     }    
  9. }    
  10.   
  11. var mc = new myClass();  
  12. alert(mc.toString())  

而且这样的定义要清晰得多:)
0 请登录后投票
   发表时间:2007-05-25  
if((super.hasOwnProperty && super.hasOwnProperty('toString')) || (!super.hasOwnProperty && super.toString)) {
       proto.toString = super.toString;     
}


自己琢磨去吧!
0 请登录后投票
   发表时间:2007-05-25  

笨笨狗 写道:
可能你的类定义方式有问题,改为如下代码就正常了:
js 代码
 
  1. var myClass = Class.create();     
  2.   
  3. myClass.prototype = {    
  4.      initialize : function () {  
  5.      },    
  6.      toString : function () {    
  7.          return "myClass";    
  8.     }    
  9. }    
  10.   
  11. var mc = new myClass();  
  12. alert(mc.toString())  

而且这样的定义要清晰得多:)

谢谢笨笨狗的提醒,Prototype的Object.extend,是用for key in object来实现的,我想可能是for key的时候,无法取得Object的系统实现方法。

0 请登录后投票
   发表时间:2007-05-26  
笨笨狗 写道
的确有这个问题,刚才测试了一下,在firefox中是正确覆盖了的,但是ie就没有,奇怪……


这是因为jscript和moz的js引擎在处理 for/in 的时候不一样。开发qomo框架的周爱民也发现过这个问题,和我讨论过。

简单来说,规范规定对于toString,valueOf等“不可枚举”属性,在for/in时不能列出来。jscript的做法是,看名字,也就是说所有属性名属于一个“不可枚举”列表的名单中,那就不会被for/in出来,即使该属性的值实际上已经被改写。moz等引擎却不是这样。

从规范来说,并没有明确规定哪种方式才是正确的,但我与qomo的周爱民等,都认为显然jscript的“名不副实”的做法是很“白痴”的做法。
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics