-4

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

fun.apply(this);
fun.call(this);
fun.bind(this); fun();

但是如果函数是 DOM 对象构造函数,你如何远程调用它并传递this.

一个例子是XMLhttpRequest

让它像 XMLhttpRequest.apply(etc) 一样工作;

我正在尝试制作构造函数,它不仅可以使用 Dom 对象构造函数初始化一个新对象,还可以添加我希望它具有的额外内容。

例如:

function myxmlhttpfunc () {
     this = new XMLhttpRequest();
     this.myprop = 'etc';
}

但是您可以尝试或看到第二行不起作用,我尝试使用应用、调用、绑定。做到这一点的唯一方法是 returnnew XMLhttpRequest();覆盖myprop. 如果有办法在返回时执行多个语句,我将不胜感激。我什至正在考虑调用 settimeout,但试图避免它。我要做的是将它作为超时的引用传递给它,一旦它被 return 初始化,然后定义我喜欢的新属性。

4

1 回答 1

1

只需制作一个包装器,就不可能从 XHR 继承,因为这些方法被硬编码为仅适用于合法的 XHR 对象 - 即它们是非泛型的。

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 之类的东西来说很容易无关紧要

于 2013-08-04T16:24:03.650 回答