javascript原型无法正常工作

时间:2012-02-18 06:19:08

标签: prototype javascript function-prototypes

我错误地认为.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是。

编辑:我已经尝试了以下内容,而我似乎无法正确使用这个原型。

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();

编辑:感谢Matthew Flaschen的最终结果,感谢任何有兴趣从中构建的人。

(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 个答案:

答案 0 :(得分:6)

是的,正确的版本如下。 dumper是构造函数。因此,它初始化list成员。

下面,我们使用所需的方法设置dumper原型。这些也可以使用thisdumper的任何实例(例如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();