Возможно ли, чтобы конструктор javascript возвращал разные типы объектов? - PullRequest
8 голосов
/ 07 мая 2011

Я хотел бы сделать что-то вроде этого:

function AjaxRequest (parameters) {
    if (window.XMLHttpRequest) {
        this = new XMLHttpRequest();
    else if (typeof ActiveXOBject != 'undefined')
        this = new ActiveXObject("Microsoft.XMLHTTP");
}

AjaxRequest.prototype.someMethod = function () { ... }

Есть ли способ сделать это?

Ответы [ 2 ]

10 голосов
/ 07 мая 2011

Можно вернуть объект другого типа из конструктора, но не совсем так, как вы пытаетесь сделать.Если вы вернете объект вместо undefined (который является возвращаемым значением по умолчанию), он «заменит» его как результат выражения new.Однако объект не получит свой прототип из конструктора (и x instanceof AjaxRequest не будет работать).

Это приблизит вас, если вы захотите это сделать:

function AjaxRequest (parameters) {
    var result;

    if (window.XMLHttpRequest)
        result = new XMLHttpRequest();
    else if (typeof ActiveXOBject != 'undefined')
        result = new ActiveXObject("Microsoft.XMLHTTP");

    // result is not an AjaxRequest object, so you'll have to add properties here
    result.someMethod = function () { ... };

    // Use result as the "new" object instead of this
    return result;
}
2 голосов
/ 07 мая 2011

Хм. Нет, я так не думаю. this не устанавливается. Вы не можете изменить его, но можете добавить к нему свойства. Вы можете совершать вызовы, при которых для this устанавливается , но вы не можете установить его напрямую.

Вы можете сделать что-то вроде этого:

function AjaxRequest (parameters) { 
    this.xhr = null;
    if (window.XMLHttpRequest) { 
        this.xhr = new XMLHttpRequest();  
    }
    else if (typeof ActiveXOBject != 'undefined') {
        this.xhr = new ActiveXObject("Microsoft.XMLHTTP"); 
    }  
}

AjaxRequest.prototype.someMethod = function (url) { 
    this.xhr.open('Get', url, true);
    this.req.onreadystatechange = function(event) {
        ...
    };
    this.xhr.send(...);
};

Отступив, я думаю, ваш дизайн не очень понятен. Что вы пытаетесь сделать? Еще один способ задать вопрос: Какую модель использования вы снимаете для ? Какие глаголы вы хотите выделить из AjaxRequest Какими методами?

Если вы посмотрите на jQuery, их «запрос ajax» - это не объект, а метод. $ajax()....

Какая ваша идея?

Это будет определять способ использования свойства xhr и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...