toString方法无法被继承

时间:2010-02-04 13:04:00  来源:第二电脑网  作者:第二电脑网

  第二电脑网导读:类中定义toString方法,以此为它的各个子类提供相似的字符串表现形式是常用的做法之一,但是如果您使用Microsoft AJAX Library的面向对象机制进行开发时就会遇到一个问题。        那就是toString方法无法被继承。        说的更明白一些,就是子类无法获得父类的toString方法的实现。除非在子类中直接定义一个toS...
  正文:背景
    在我看来,toString方法是一个类最重要的方法之一。在JavaScript中,将一个对象转化为字符串形式的默认方法就是调用其toString方法。因此,为类型实现一个合理的toString方法对于开发和调试都有一定的好处。在面向对象编程中,在父类中定义toString方法,以此为它的各个子类提供相似的字符串表现形式是常用的做法之一,但是如果您使用Microsoft AJAX Library的面向对象机制进行开发时就会遇到一个问题。
  
    那就是toString方法无法被继承。
  
    说的更明白一些,就是子类无法获得父类的toString方法的实现。除非在子类中直接定义一个toString方法,否则它只能含有JavaScript中默认的toString方法。很显然,这没有任何意义,也失去了面向对象的重要特性。
  
  问题重现
    我们通过一个再简单不过的例子来重现这个问题:
  
  Type.registerNamespace("Demo");
  
  // Definition of Demo.Parent class.
  Demo.Parent = function() {}
  Demo.Parent.prototype =
  {
   toString : function()
   {
   return Object.getTypeName(this);
   }
  }
  Demo.Parent.registerClass("Demo.Parent");
  
  // Definition of Demo.Child class, which inherits Demo.Parent.
  Demo.Child = function()
  {
   Demo.Child.initializeBase(this);
  }
  Demo.Child.prototype = {}
  Demo.Child.registerClass("Demo.Child", Demo.Parent);
  
  // Call the toString method implicitly.
  alert(new Demo.Parent());
  alert(new Demo.Child());
  
    上面的代码定义了两个类,父类Demo.Parent和子类Demo.Child。其中父类Demo.Parent中定义了toString方法,因此按照面向对象编程的机制,子类Demo.Child也会使用父类的toString方法实现。可惜结果并不如人意,在IE中,上面的代码会显示如下的结果:
  
  Demo.Parent
  [object Object]
  
    通过调用Demo.Parent对象的toString方法,我们得到了期望中的表示当前对象实际类型的字符串。但是调用Demo.Child对象的toString方法却只得到了JavaScript中默认的结果。
  
  这是怎么回事?
    对于使用JavaScript面向对象机制的实现有一定了解的朋友会知道,JavaScript中是使用了prototype链的特性来实现的面向对象的效果。在Microsoft AJAX Library中,“继承”的做法其实只是遍历父类prototype上的所有属性,并为子类的prototype对象添加不存在的属性。简单地说,它的代码实现就如下面的代码所示(请注意,真正的实现并非只有这部分代码,但是这部分代码是继承实现的关键):
  
  for (var memberName in baseType.prototype)
  {
   var memberValue = baseType.prototype[memberName];
   if (!this.prototype[memberName])
   {
   this.prototype[memberName] = memberValue;
   }
  }
  
    这么做的目的,是希望让子类的prototype对象能够拥有父类的prototype对象中定义的成员,并能够使自身重新定义的方法实现覆盖父类的同名方法。显然,这样就获得了“继承”的效果。不过,如此实现“继承”的重要部分就是使用for...in语法来遍历一个对象上的所有属性——可能有些朋友已经看出问题所在了。没错,我们现在来写一段最简单的代码来验证我们的猜想:
  
  for (var memberName in Demo.Parent.prototype)
  {
   alert(memberName);
  }
  
    果然不出所料,遍历Demo.Parent的prototype对象上的成员却没有得到任何的结果。我们再来写一个更原始的例子,我们直接遍历一个Object对象:
  
  var obj = new Object();
  for (var memberName in obj)
  {
   alert(memberName);

"toString方法无法被继承"由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Programming/aspnet/12784.html


关键字:

关于《toString方法无法被继承》文章的评论

站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td