0

出于试用的目的,我在阅读了这篇关于继承的 mdn 文章后,我想创建一个直接从 XMLHttpRequest 继承的对象,如下所示:

function Request( url ){
    XMLHttpRequest.call( this );
};

Request.prototype = Object.create( 
    new XMLHttpRequest(),{
    'constructor' : {
        'value' : Request,
        'enumerable' : true
    },

    'toString' : {
        'value' : function(){
            return '[Object Request]';
        },
        'enumerable' : true
    }
});

这本身不会造成任何麻烦,但是当我尝试使用实例时。在创建后调用继承的 .open(method, location) -method 使浏览器抛出此错误:

错误截图

有谁知道为什么会抛出这个错误?我用其他对象尝试了这种继承技术,它工作得很好,那么为什么不使用 XMLHttpRequest 呢?

问候菲利普

4

1 回答 1

1

大多数 DOM 构造函数不能被继承。我想知道你没有得到WRONG_THIS_ERROR……</p>

我尝试了这种与其他对象的继承技术,效果很好

它适用于函数构造函数,因为它们的.call方法与使用关键字作为构造函数[[construct]]调用时所做的事情相似。new

为什么不使用 XMLHttpRequest?

因为它是一个原生对象,它[[construct]]会调用一些原生代码,而不是调用[[call]]函数体。实际上它的[[call]]行为将被定义为像以前一样工作[[construct]],因此XMLHttpRequest可以在没有的情况下调用它,new但也会返回一个新实例。您可以尝试xhr = XMLHttpRequest.call(anything)- 它不会改变anything,但会返回一个新对象。

与其继承它(甚至扩展原生原型),不如围绕它构建一个包装器。

于 2013-08-18T12:47:59.873 回答