两个父函数都被子进程覆盖。孩子中有两个叫父母的两个。但是,我期望在父级别,对一个人的调用会调用孩子的方法。有一个我缺少的概念吗?
提前谢谢!
function parent(){}
parent.prototype.one = function(){
$('body').append("Parent: one <br/>");
}
parent.prototype.two = function(){
this.one();
$('body').append("Parent: two <br/>");
}
function child(){}
child.prototype = new parent();
child.prototype.constructor = child;
child.prototype.one = function(){ //should this function not be called?
$('body').append('Child: one <br />');
}
child.prototype.two = function(){
$('body').append('Child: do some child stuff here and call parent: <br />');
parent.prototype.two();
}
var k = new child();
k.two();
答案 0 :(得分:4)
更优化的方式几乎就像你正在做的那样,但你通过this
调用父方法:
child.prototype.two = function(arg1, arg2) {
parent.prototype.two.call(this, arg1, arg2);
};
但我建议您使用自定义功能进行扩展,您可以使用 jsbase
中的extend
如果您正在使用ECMAScript 5 getter / setter(如果不只是使用第一个),您可以优先使用 this gist
的那个两者都可以基于Dean Edward的想法以同样的方式使用:
var Animal = extend(Object, {
constructor: function(name) {
// Invoke Object's constructor
this.base();
this.name = name;
// Log creation
console.log('New animal named ' + name);
},
// Abstract
makeSound: function() {
console.log(this.name + ' is going to make a sound :)');
},
});
var Dog = Animal.extend({
constructor: function(name) {
// Invoke Animals's constructor
this.base(name);
// Log creation
console.log('Dog instanciation');
},
bark: function() {
console.log('WOF!!!');
},
makeSound: function() {
this.base();
this.bark();
}
});
var pet = new Dog('buddy');
// New animal named buddy
// Dog instanciation
pet.makeSound();
// buddy is going to make a sound :)
// WOF!!!
在你的情况下,它可以是:
var parent = extend(Object, {
one: function() {
$('body').append("Parent: one <br/>");
},
two: function() {
this.one();
$('body').append("Parent: two <br/>");
}
});
var child = parent.extend({
one: function() {
$('body').append('Child: one <br />');
},
two: function() {
$('body').append('Child: do some child stuff here and call parent: <br />');
this.base();
}
});
答案 1 :(得分:1)
嗯,我明白你想要的...... 定义你的功能如下:
child.prototype.two = (function(){
if(child.prototype.two){
var tmp = child.prototype.two;
return function(){
$('body').append('Child: do some child stuff here and call parent: <br />');
tmp.apply(this,arguments);
};
}
})()
如果原型上没有定义相同的函数,你可以添加else条件来返回一个函数。
答案 2 :(得分:0)
slebetman回答:
parent.prototype.two.call(this)
而不是直接调用父的两个函数。