Javascript继承 - 对子方法的调用总是调用父

时间:2015-04-23 18:09:10

标签: javascript inheritance prototype

这是我第一次在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()会被执行。我现在几乎没有想到可能出现什么问题。

1 个答案:

答案 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.…

对于作业,订单事宜: - )