прототип javascript не работает - PullRequest
1 голос
/ 18 февраля 2012

Я ошибаюсь, что .prototype должен делать, или это просто не работает ??

window.dump = function () {
    for (var i = 0, x = dump.list.length; i < x; ++i) console.log.apply(this, dump.list[i]);
    if (arguments.length && typeof arguments[0] === 'boolean' && arguments[0]) dump.purge();
}
dump.prototype = {
    list : [],
    log : function () {
        dump.list.push(arguments);
    },
    purge : function () {
        dump.list = [];
    }
}
dump.log('test1');
dump.log('test2');
dump();

Я ожидаю, что "test1" и "test2" будут проходить через console.log, вместо этогоdump.log не определено.Однако dump.prototype.log is.

edit: я попробовал следующее, и я просто не могу понять, как работает этот прототип.

window.dump = new function () {
    this.list = [];
    this.log = function () {
        this.list.push(arguments);
    }
    this.purge = function () {
        return this.list = [];
    }
    return function () {
        for (var i = 0, x = this.list.length; i < x; ++i) console.log.apply(this, this.list[i]);
        if (arguments.length && typeof arguments[0] === 'boolean' && arguments[0]) this.purge();
    }
}

Я думаю, что яСпрашивается, как правильно использовать мой код следующим образом?

dump.log('test1');
dump.log('test2');
dump();

edit: Вот окончательный результат, спасибо Мэтью Флешену, за всех, кто заинтересован в его построении.

(function () {
    var console_log = Function.prototype.bind.call(console.log, console);
    window.dump = function () {
        for (var i = 0, x = dump.list.length; i < x; ++i) console_log.apply(this, dump.list[i]);
        if (arguments.length && typeof arguments[0] === 'boolean' && arguments[0]) dump.purge();
    };
    dump.list = [];
    dump.log = function () {
        dump.list.push(arguments);
    }
    dump.purge = function () {
        dump.list = [];
    }
})();

Мне пришлось присвоить console_log для переноса console.log, потому что, очевидно, console не является стандартным объектом.Поэтому это не стандартный объект Function с методом apply.Доказательство того, что я действительно использую Google.

1 Ответ

6 голосов
/ 18 февраля 2012

Да, правильная версия будет ниже.dumper является функцией конструктора.Таким образом, он инициализирует член list.

Ниже мы устанавливаем прототип dumper требуемыми методами.Они также могут использовать this.Любой экземпляр dumper (например, d) будет иметь эти методы.

window.dumper = function () {
    this.list = [];
};

dumper.prototype = {

    log : function () {
        this.list.push(arguments);
    },
    purge : function () {
        this.list = [];
    },
    dump : function () {
        for (var i = 0, x = this.list.length; i < x; ++i) console.log.apply(this, this.list[i]);
        if (arguments.length && typeof arguments[0] === 'boolean' && arguments[0]) this.purge();
    }
}


var d = new dumper();        

d.log('test1');
d.log('test2');
d.dump();
...