9

親関数は両方とも子によってオーバーライドされます。子の two が親の two を呼び出しています。ただし、親レベルでは、1つを呼び出すと子のメソッドが呼び出されると予想していました。私が見逃している概念はありますか?

前もって感謝します!

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

3 に答える 3

4

より最適な方法は、あなたがやっているのとほぼ同じですが、親メソッドを次のように呼び出しますthis

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

ただし、カスタム関数を使用して拡張することをお勧めします。jsbaseextendから使用できます。

ECMAScript 5 の getter/setter を使用している場合 (最初のものだけを使用しない場合)、このgist のものを使用することをお勧めします。

ディーン・エドワードのアイデアに基づいて、どちらも同じように使用できます。

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();
  }
});
于 2013-09-26T21:43:23.403 に答える
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 条件を追加して関数を返すことができます。

于 2013-09-26T05:14:55.690 に答える