您可以像这样调用普通函数或构造函数:
fun.apply(this);
fun.call(this);
fun.bind(this); fun();
但是如果函数是DOM对象构造函数,那么如何远程调用它并传递this
。
一个例子是XMLhttpRequest
。
让它像XMLhttpRequest.apply(etc);
一样工作我正在尝试创建构造函数,不仅使用Dom Object Constructor初始化一个新对象,而且还添加了我希望它拥有的额外内容。
例如:
function myxmlhttpfunc () {
this = new XMLhttpRequest();
this.myprop = 'etc';
}
但是,你可以尝试或看到第二行不会工作,我尝试使用apply,call,bind。获得它的唯一方法是返回new XMLhttpRequest();
,它会覆盖myprop
。如果有办法在返回时执行多个语句,我会很感激。我甚至考虑调用settimeout,但试图避免它。我做的是通过返回初始化然后按照我的喜好定义新属性,将其作为超时的参考传递。
答案 0 :(得分:1)
只需创建一个包装器,就不可能从XHR继承,因为这些方法是硬编码的,只适用于合法的XHR对象--I.E。它们是非通用的。
function MyXhr() {
this.prop = "asd";
this.xhr = new XMLHttpRequest();
}
var method = MyXhr.prototype;
//Define all the standard methods to work on `this.xhr`
//Example
method.open = function( method, url, async, user, password ) {
if( this.prop !== "asd" ) {
throw new Error( "Cannot open if prop is not 'asd'" );
}
return this.xhr.open( method, url, async, user, password );
};
这里基本上是内置方法内部发生的事情以及为什么没有任何效果:
function XMLHttpRequest() {
...
}
XMLHttpRequest.prototype.open = function() {
//ALL methods do this check which is why nothing can work:
if( !( this is true object of XMLHttpRequest ) ) {
throw new Error("Invalid invocation");
}
};
顺便说一句,如果你可以扩充,那么你可以这样做:
function MyXhr() {
var ret = new XMLHttpRequest();
ret.prop = "asd";
ret.newMethod = function(){};
return ret;
}
这样,函数不会被继承,但对于像XHR
这样的东西来说,这很容易