【发布时间】:2017-02-28 18:43:05
【问题描述】:
我正在尝试使用原型在 javascript 中制作计时器。每次创建一个新的计时器时,都会创建一个原型对象。有增加时间和每秒打印的方法。整个代码sn-p如下:
function Timer(elem) {
this.interval = null;
this.currentTime = {
sec: 0,
min: 0,
hr: 0
};
this.elem = elem;
};
Timer.prototype.start = function() {
var self = this;
if (!self.interval) {
self.interval = setInterval(update, 1000);
}
function update() {
incrementTime();
render();
}
function render() {
self.elem.innerText = getPrintableTime();
}
function incrementTime() {
self.currentTime["min"] += Math.floor((++self.currentTime["sec"]) / 60);
self.currentTime["hr"] += Math.floor(self.currentTime["min"] / 60);
self.currentTime["sec"] = self.currentTime["sec"] % 60;
self.currentTime["min"] = self.currentTime["min"] % 60;
}
function getPrintableTime() {
var text = getTwoDigitNumber(self.currentTime["hr"]) + ":" + getTwoDigitNumber(self.currentTime["min"]) + ":" + getTwoDigitNumber(self.currentTime["sec"]);
return text;
}
function getTwoDigitNumber(number) {
if (number > 9) {
return "" + number;
} else {
return "0" + number;
}
}
};
module.exports = Timer;
我在start 函数中有所有方法。问题是对于Timer 的每个新对象,每个方法都会使用新空间,这是非常低效的。但是当我尝试将方法放在start 函数之外时,它们将无法访问self 变量。您可以看到使用了setInterval 函数,它将每秒调用这些方法。我也不能使用this,因为this 将在后续调用中成为Window 的实例。
我怎样才能通过只保留所有内部方法的一个实例来解决这种情况?
【问题讨论】:
-
如何创建
Timer的新对象以及如何调用。你能举个例子吗。问题似乎不在您的代码中,而是出现在您的调用方法中。 -
那么为什么不使用完全原型模式呢?
-
@epascarello 不想暴露其他功能。
-
您正在使用所选解决方案公开它们!!!!大声笑
-
我在两者之间更改了选定的解决方案。但是,如果您是在谈论以后的选择,那么请解释一下。
标签: javascript oop prototype