在未实现接口XMLHttpRequest的对象上调用错误“open”

时间:2016-02-11 17:36:51

标签: javascript ajax mootools

当我尝试在另一个类函数的类中启动ajax请求时,我收到此错误。 您可以从此示例中获取firefox控制台中的错误:

https://jsfiddle.net/d2o1d0eu/

http://codepen.io/anon/pen/dGwwKG

var MyClass = new Class({

    initialize: function(options){

        this.my_request = new Request({
            url: '/echo/html/',
            method: 'post',
            onSuccess: function(resp) {
                alert(resp);
            }
        });

    },

    request: function(param){

        this.my_request.send('html='+param);

    }   

});

var MySecondClass = new Class({

    Implements: [Options],

    options: {
        first_class: {}
    },

    initialize: function(options){

        this.setOptions(options);

        this.options.first_class.request('internal'); // error

    },

    request: function(param){

        this.options.first_class.request(param);

    }

});

var unknown_name = new MyClass();
// unknown_name.request('unknown_name test'); // ok

var test = new MySecondClass({

    'first_class': unknown_name

});

// test.request('second class test'); // error

感谢任何建议,谢谢。

1 个答案:

答案 0 :(得分:2)

在内部,Options mixin使用Object.merge,它执行传递的options参数的递归副本。

在您的代码中,您将MyClass的实例作为选项传递给MySecondClass的实例。以这种方式传递对象时,Object.merge将递归克隆该对象。这意味着在第二个类中,this.options.first_class.my_request实际上是Request实例的 clone ,并且还克隆了所有实例的对象属性。 / p>

这提出了一个问题,因为XMLHttpRequest类的实际Request对象在过程中被克隆。你最终获得的是一个基础对象(即,它只继承自Object.prototype),它具有实际XMLHttpRequest实例的所有属性和方法,但实际的例子。由于XMLHttpRequest的方法认为您尝试在非实例上调用方法,因此会出现DOMException。

外卖是这样的:不会将Class个实例作为选项传递。相反,将它们作为单独的参数传递:new MySecondClass(unknown_name, options)