Javascript Prototype继承自ActiveXObject导致Internet Explorer中的错误

时间:2011-11-06 00:04:37

标签: javascript inheritance

我有一个继承自ActiveXObject的Javascript对象/类。但是当我在Internet Explorer(版本8)中运行代码时,我得到了这个奇怪的错误。

错误是:“对象不支持此属性或方法”

你能告诉我这个错误是什么意思吗?如何解决这个错误?

我的代码是:

  function XMLHandler( xmlFilePath )
  {
     this.xmlDoc  = null;
     this.xmlFile = xmlFilePath;
     this.parseXMLFile( this.xmlFile );

     this.getXMLFile = function()
     {
        return this.xmlFile;
     }
  }

  XMLHandler.prototype              = new ActiveXObject("Microsoft.XMLDOM");
  XMLHandler.prototype.constructor  = ActiveXObject;          // Error occurs here in IE. The error is: "Object doesn't support this property or method"
  XMLHandler.prototype.parseXMLFile = function( xmlFilePath ) // If I comment out the above line then the exact same error occurs on this line too
  {
     this.xmlFile = xmlFilePath;
     this.async="false";  // keep synchronous for now
     this.load( this.xmlFile );
  }

1 个答案:

答案 0 :(得分:1)

错误对我来说非常明显。你做的是:

var x = new ActiveXObject("Microsoft.XMLDOM");
x.extendIt = 42;

它抛出一个(含糊的)错误,说你不能用新属性扩展ActiveXObject的实例。

现在ActiveXObject是一个宿主对象,并且已知它们充满了未定义的行为。不要延长它。而是使用它。

var XMLHandler = {
    XMLDOM: new ActiveXObject("Microsoft.XMLDOM"),
    parseXMLFile: function(xmlFilePath) {
        this.xmlFile = xmlFilePath;
        this.XMLDOM.load(xmlFilePath);
    },
    getXMLFile: function () {
        return this.xmlFile;
    }
};

var xmlHandler = Object.create(XMLHandler);
xmlHandler.parseXMLFile(someFile);

(我修复了你的代码,你需要一个ES5垫片来支持传统平台)。

当然,如果您现在查看代码,可以看到您无缘无故地为.load创建了代理。您也可以直接使用XMLDOM对象。