这是我第一次在Javascript中使用继承。我在一个对象“LatchOn”和一个对象“LatchOnSlider”之间有一个经典的父子关系,该对象具有基类的所有功能,然后是更多。剥离代码:
/*creating the instances*/
var latchon = NewLatchOn(); //arguments not important for this
var latchonslider = NewLatchOnSlider();
//factory function
function NewLatchOn(element_id, container_id, screenpos, release)
{
var newLatchOn = new LatchOn(element_id, container_id, screenpos, release);
newLatchOn.startTimer();
}
function LatchOn(element_id, container_id, screenpos, release)
{
//initialise stuff
}
LatchOn.prototype.startTimer = function()
{
var that = this;
setInterval(function(){that.checkPos()}, 10);
}
LatchOn.prototype.checkPos = function()
{
//do stuff
}
LatchOnSlider.prototype.constructor = LatchOnSlider;
//factory function
function NewLatchOnSlider(element_id, container_id, image_class, screenpos)
{
LatchOnSlider.prototype = Object.create(LatchOn.prototype);
var newSlider = new LatchOnSlider(element_id, container_id, image_class, screenpos);
newSlider.startTimer();
return newSlider;
}
function LatchOnSlider(element_id, container_id, image_class, screenpos)
{
LatchOn.call(this, element_id, container_id, screenpos, "CONTAINER");
//initialise own stuff
}
LatchOnSlider.prototype.startTimer = function()
{
var that = this;
setInterval(function(){that.checkPos()}, 10);
}
/*keeps track of when to switch images*/
LatchOnSlider.prototype.checkPos = function()
{
alert("child process called");
}
对象必须在浏览器中侦听滚动位置并根据该信息进行操作。所以他们有一个计时器运行。但是因为对于继承对象运行的两个计时器来说它不是最佳的,我想我可以运行一个调用子对象上的函数的计时器,它将调用基函数然后做自己的东西(调用基数)功能还没有在代码中。我还没有那么远......)。
为了不必为每个实例单独启动计时器,我创建了工厂函数来初始化对象并启动它们的计时器。这就是我被困住的地方。无论我做什么,如果我在LatchOnSlider对象上调用startTimer,则会调用父函数。我已经查看了至少五个不同的教程,并尝试了所有的语法变体,但没有解决问题。我已经在firebug中完成了这个过程,这个过程按照预期进行。调用LatchOnSlider的构造函数,从那里调用基础对象的构造函数,一切都正确初始化,就在调用LatchOnSlider.startTimer()时,LatchOn.startTimer()会被执行。我现在几乎没有想到可能出现什么问题。
答案 0 :(得分:0)
这一行是问题所在:
function NewLatchOnSlider(element_id, container_id, image_class, screenpos) { LatchOnSlider.prototype = Object.create(LatchOn.prototype);
在这里,您每次创建实例时都要创建一个新的原型对象。这些新原型没有您之前在“旧”LatchOnSlider.prototype
上分配的方法,并且您的实例不会继承它们 - 间接只有LatchOn.prototype
方法。
您需要将构造函数声明和原型初始化与工厂函数分开:
function NewLatchOnSlider(element_id, container_id, image_class, screenpos) {
var newSlider = new LatchOnSlider(element_id, container_id, image_class, screenpos);
newSlider.startTimer();
return newSlider;
}
function LatchOnSlider(element_id, container_id, image_class, screenpos) {
LatchOn.call(this, element_id, container_id, screenpos, "CONTAINER");
// initialise own stuff
}
LatchOnSlider.prototype = Object.create(LatchOn.prototype);
LatchOnSlider.prototype.constructor = LatchOnSlider;
LatchOnSlider.prototype.startTimer = function() { … }
LatchOnSlider.prototype.…
对于作业,订单事宜: - )