Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从父方法调用时,父方法重写子方法_Javascript - Fatal编程技术网

Javascript 从父方法调用时,父方法重写子方法

Javascript 从父方法调用时,父方法重写子方法,javascript,Javascript,我知道这是一个糟糕的标题,但这是一个更容易用例子来定义的问题 我有一个涉及多个继承级别的代码结构,我的示例只显示了两个,因为这足以演示行为 var parent = function() { var self = this; self.parent = function() { self.test(); } self.test = function() { alert('parent'); } }; var chil

我知道这是一个糟糕的标题,但这是一个更容易用例子来定义的问题

我有一个涉及多个继承级别的代码结构,我的示例只显示了两个,因为这足以演示行为

var parent = function() {
    var self = this;

    self.parent = function() {
        self.test();
    }

    self.test = function() {
        alert('parent');
    }
};


var child = function() {
    var self = this;

    self.child = function() {
        self.test();
        self.parent();
    }

    self.test = function() {
        alert('child')
    }
};

child.prototype = new parent();

var o = new child();
o.child();
我希望调用child方法会显示两个警报,都显示文本“child”,但这仅适用于第一个警报,第二个警报显示“parent”

请看这里的小提琴:

有人能解释为什么会发生这种情况吗?

o.child()
调用
o
上的
child()
方法,即:

self.child = function() {
    self.test();
    self.parent();
}
self.test()

self.test = function() {
    alert('child')
}
这是您看到的第一个警报

第二种情况是运行
self.parent()
时。由于
child
的原型是
parent
,因此调用
self.parent()
调用:

self.parent = function() {
    self.test(); 
}
我想您的困惑就在这里-为什么
self.test()
调用父对象而不是子对象?

原因是您有这样一行:
var self=this
。这意味着,
This
已放入
self
,并且不会重新评估。意思是,
self
是父项

作为证据,如果将方法主体切换为:

self.parent = function() {
    this.test(); //will alert "child"
}

你会看到两个“儿童”警报,因为
这个
对儿童进行评估。

谢谢你,这让我明白了我一直在努力想的事情。将“this”放在self中是为了给我一个实例的永久引用,例如事件调用self.parent()时,“this”现在是对html表单元素的引用。。。你能找到解决这个问题的方法吗?你可以在函数内部询问:
if(this.hasOwnProperty(“test”){…}
。如果从子对象调用,那么它将返回true,因为子对象具有此函数(其他派生函数可能没有)。事件可能会返回false,除非您有一个具有该名称的全局变量/函数。这有帮助吗?对不起,我不认为我的问题特别清楚,这里有一个小提琴的更新版本,显示了新的问题:所以我试图从一个调用父函数的事件调用孩子的方法是的,这就是我的意思,这里看一下更新后的小提琴-我在评论中编写了代码。如果不清楚,请告诉我Hi Omri,我现在明白你的意思了,对于给定的解决方案,这将非常有效。此后,我发现了一种使用jQuery的替代解决方案,在jQuery中,我可以在事件绑定的事件数据中传递当前上下文,这对于我抽象程度较低的问题更为有效。非常感谢您的帮助:)