Подтвердить что ты не робот

Функция переопределения в JavaScript

Возможный дубликат:
Вызов базового метода с использованием прототипа JavaScript

Я хочу объект наследования, который переопределит функцию в javascript.

Из метода, который я хочу вызвать базовому методу. В этом случае я наследую объект reader от Person, и теперь я хочу переопределить функцию getName, что означает, что в первом читателе я хочу вызвать функцию на Person, а затем внести некоторые изменения.

<script>
    /* Class Person. */
    function Person(name) {
        this.name = name;
    }
    Person.prototype.getName = function() {
        return this.name;
    }

    var reader = new Person('John Smith');
    reader.getName = function() {
        // call to base function of Person, is it possible?
        return('Hello reader');
    }
    alert(reader.getName());
</script>
4b9b3361

Ответ 1

Поскольку вы правильно переопределяете функцию самого объекта, а не его прототипа, вы все равно можете вызвать функцию прототипа с вашим объектом.

reader.getName = function() {
    var baseName = Person.prototype.getName.call(this);
    ...
}

Ответ 2

Винсент ответил на ваш прямой вопрос, но вот что вы сделали бы, если бы вы хотели создать истинную иерархию наследования, где вы можете продолжить расширение Reader.

Создайте класс человека:

function Person(name) {
    this.name = name;
}

Person.prototype.getName = function(){
    alert('Person getName called for ' + this.name);
    return this.name;
}

Создайте класс Reader:

function Reader(name) {
    // Calls the person constructor with `this` as its context
    Person.call(this, name);
}

// Make our prototype from Person.prototype so we inherit Person methods
Reader.prototype = Object.create(Person.prototype);

// Override Persons getName
Reader.prototype.getName = function() {
    alert('READER getName called for ' + this.name);
    // Call the original version of getName that we overrode.
    Person.prototype.getName.call(this);
    return 'Something';
}
Reader.prototype.constructor = Reader;

И теперь мы можем повторить аналогичный процесс, чтобы расширить Reader, скажем, VoraciousReader:

function VoraciousReader(name) {
    // Call the Reader constructor which will then call the Person constructor
    Reader.call(this, name);
}

// Inherit Reader methods (which will also inherit Person methods)
VoraciousReader.prototype = Object.create(Reader.prototype);
VoraciousReader.prototype.constructor = VoraciousReader;
 // define our own methods for VoraciousReader
//VoraciousReader.prototype.someMethod = ... etc.

скрипка: http://jsfiddle.net/7BJNA/1/

Object.create: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/create

Object.create(arg) создает новый объект, прототип которого был передан как аргумент.

Ответ 3

Я использую эту технику от Джона Ресига, чтобы получить наследование и метод переопределения. Он даже позволяет вам получить доступ к переопределенному методу, вызвав this._super().

http://ejohn.org/blog/simple-javascript-inheritance/

Ответ 4

Это один из способов сделать это:

function Person(name) {
this.name = name;
}
Person.prototype.getName = function(){
return this.name;
}

var reader = new Person('John Smith');
reader.oldGetName = reader.getName;
reader.getName = function() {
//call to base function of Person , is it possible ?
    return this.oldGetName();
}
alert(reader.getName());​

http://jsfiddle.net/fXWfh/