Как вызвать родительский метод из переопределяющего метода в дочернем классе

Как я могу получить доступ к методу из родительского класса, который был переопределен в дочернем классе? В моем примере ниже я хочу вызвать метод bar.my_name() внутри переопределяющего метода в foo.my_name()

function bar() {
  this.my_name = function() {
    alert("I Am Bar");
  }
}

function foo() {
  this.my_name = function() {
    alert("I Am Foo");
    //access parent.my_name()
  }
}

foo.prototype = Object.create(bar.prototype);
foo.prototype.constructor = foo;

var test = new foo();
test.my_name();

person helloworld2013    schedule 31.03.2014    source источник
comment
Вы вообще не используете прототип в примере кода. Установка foo.prototype ничего не делает, потому что bar имеет только переменные экземпляра. Возможно, следующий ответ поможет вам понять прототип JavaScript: stackoverflow.com/a/16063711/1641941   -  person HMR    schedule 01.04.2014


Ответы (2)


Вы можете сделать это:

(new bar()).my_name.call(this);

Я думаю, вы немного запутались в том, как работают прототипы, поскольку они на самом деле не помогают вам здесь.

Это может быть немного лучше:

var bar = {
    my_name: function () {
        console.log('bar name');
    }
};

var foo = Object.create(bar);

foo.my_name = function () {
    console.log('foo name');
    bar.my_name.call(this);
};

Или, если вы хотите использовать конструкторы, что-то вроде этого:

function Bar () {}

Bar.prototype.my_name = function () {
    console.log('bar name');
};

var foo = Object.create(Bar.prototype);

foo.my_name = function () {
    console.log('foo name');
    bar.my_name.call(this);
};

Но я не совсем понимаю, что вы пытаетесь сделать и почему, поэтому с большим контекстом будет легче дать вам лучший совет.

person Tom    schedule 31.03.2014
comment
Я думаю, что это соответствует тому, чего я хочу достичь. Наверное, мне просто нужно лучше разбираться в прототипах. - person helloworld2013; 01.04.2014

Одно из возможных решений — перенести метод в прототип базового класса.

function bar() {
}

bar.prototype.my_name = function() {
  alert("I am bar");
}

function foo() {
}

foo.prototype = Object.create(bar.prototype);
foo.prototype.my_name = function() {
    alert("I Am Foo");
    bar.prototype.my_name.call(this);
}

foo.prototype.constructor = foo;

var test = new foo();
test.my_name();
person Wiktor Zychla    schedule 31.03.2014