【问题标题】:how to pass 'this' value to DOM object constructor如何将“this”值传递给 DOM 对象构造函数
【发布时间】:2013-08-04 14:48:58
【问题描述】:

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

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';
}

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

【问题讨论】:

  • 这样做你想达到什么目的?你想解决什么问题?
  • 解释太长了..:D
  • 你想让一个对象继承自 DOM 对象吗?
  • @MuhammadUmer 好的,那太神秘了,无法回答:D

标签: javascript


【解决方案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 这样的东西来说很容易就无关紧要

【讨论】:

  • “这些方法是硬编码的,只适用于合法的 XHR 对象”......好吧,我在 3 小时的地狱之后和在这里发布之前发现了这一点。经过长时间的尝试,我想也许我会把它放在 proto 中,像这样的 this.__proto__= new XMLHttpRequest(); 属性,比如 open 出现但没有用。
  • @MuhammadUmer 是的,这是行不通的,因为这些方法只适用于我所说的 XHR 对象,所以唯一可行的是我建议的包装器......相信我
  • @MuhammadUmer 让我试着在我的回答中解释一下
  • 花费 6 小时以上。我已经做了。我想修改onreadystate 函数,这样无论它在哪里定义,它都可以保留我的函数。我必须学习 3 种技术,并使用了我认为 4 种技术,同时尝试了 9 种技术。原型,应用,调用,绑定,不会工作。神秘的是,如果您使用定义属性重新定义它也不会被调用。 jsfiddle.net/techsin/hAsP7/14
  • @MuhammadUmer 你应该在你的问题中说你想做什么(猴子补丁 onreadystatechange setter),我认为会为你节省很多时间:P Classic XY problem
猜你喜欢
  • 1970-01-01
  • 2014-06-04
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
  • 2017-03-17
  • 1970-01-01
相关资源
最近更新 更多