Javascript: вызов дочерней функции из родительской (супер?) функции.

Обе родительские функции переопределяются дочерними. два в ребенке звонят родителю два. однако я ожидал, что на родительском уровне вызов одного вызовет дочерний метод. Есть ли концепция, которую я упускаю?

Заранее спасибо!

http://jsfiddle.net/9mbGN/

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();

person alotofquestions    schedule 26.09.2013    source источник
comment
this.one() звонит parent.prototype.one() в two() вашего ребенка, потому что this это parent.prototype   -  person Joe Simmons    schedule 26.09.2013
comment
Есть ли способ вызвать child.prototype.one?   -  person alotofquestions    schedule 26.09.2013
comment
Просто позвонить child.prototype.one() ? Я не уверен, что вы на самом деле пытаетесь сделать. Для чего все это?   -  person Joe Simmons    schedule 26.09.2013
comment
но не противоречит ли это цели наследования?   -  person alotofquestions    schedule 26.09.2013
comment
Почему бы не просто parent.prototype.two.call(this) ?   -  person slebetman    schedule 26.09.2013
comment
Да, это то, что я искал. Благодарю вас!   -  person alotofquestions    schedule 26.09.2013
comment
@JoeSimmons Это неправда, this.one — это последнее значение one в цепочке прототипов this, и это child.prototype.one. this` — это объект, а не прототипы child.prototype, чем прототипы parent.prototype   -  person A. Matías Quezada    schedule 27.09.2013
comment
@A.MatíasQuezada: я тебя не понимаю.   -  person Joe Simmons    schedule 27.09.2013
comment
@JoeSimmons, ты сказал, что this.one() звонит parent.prototype.one в детский two(), потому что this это parent.prototype. Это неправда, this является объектом, чем прототипы child.prototype, поэтому this.one относится к child.prototype.one   -  person A. Matías Quezada    schedule 28.09.2013
comment
Когда вы называете parent.prototype.two(), "это" будет parent.prototype   -  person Joe Simmons    schedule 29.09.2013
comment
Моя вина, ты прав, извини :P   -  person A. Matías Quezada    schedule 30.09.2013


Ответы (3)


Более оптимальный способ почти такой же, как и у вас, но вы вызываете родительский метод поверх this:

child.prototype.two = function(arg1, arg2) {
  parent.prototype.two.call(this, arg1, arg2);
};

Но я рекомендую вам использовать пользовательскую функцию для расширения, вы можете использовать extend из jsbase

Если вы используете геттеры/сеттеры ECMAScript 5 (а не только первый), вы можете предпочесть использовать тот, который находится по адресу суть

Оба могут использоваться одинаково, основываясь на идее Дина Эдварда:

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();
  }
});
person A. Matías Quezada    schedule 26.09.2013

Ну, я понимаю, что вы хотите... определите свою функцию следующим образом:

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 для возврата функции, если такая же функция не определена в прототипе.

person grape_mao    schedule 26.09.2013

Отвечает Слебетман:

parent.prototype.two.call(this)

Вместо прямого вызова родительской функции two.

person alotofquestions    schedule 26.09.2013