如何将'this'值传递给DOM对象构造函数

时间:2013-08-04 14:48:59

标签: javascript

您可以像这样调用普通函数或构造函数:

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,但试图避免它。我做的是通过返回初始化然后按照我的喜好定义新属性,将其作为超时的参考传递。

1 个答案:

答案 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

这样的东西来说,这很容易