当我尝试在另一个类函数的类中启动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
感谢任何建议,谢谢。
答案 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)
。