web-dev-qa-db-fra.com

Fonction de remplacement en JavaScript

Duplicata possible:
Appel de la méthode de base à l'aide d'un prototype JavaScript

Je veux hériter d'un objet qui remplacera la fonction en javascript.

De la méthode que je veux appeler à la méthode de base. Dans ce cas, j'hérite de l'objet reader de Person et maintenant je veux remplacer la fonction getName ce qui signifie que dans le lecteur, je veux d'abord appeler la fonction sur Person et ensuite faire quelques changements.

<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>
33
user1365697

Étant donné que vous remplacez correctement la fonction sur l'objet lui-même et non sur son prototype, vous pouvez toujours appeler la fonction prototype avec votre objet.

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

Vincent a répondu à votre question directe, mais voici ce que vous feriez si vous souhaitez mettre en place une véritable hiérarchie d'héritage où vous pouvez étendre davantage Reader.

Créez votre classe de personne:

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

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

Créez également une classe 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's methods
Reader.prototype = Object.create(Person.prototype);

// Override Persons's 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;

Et maintenant, nous pouvons répéter un processus similaire pour étendre Reader avec, par exemple, un VoraciousReader:

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

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

violon: http://jsfiddle.net/7BJNA/1/

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

Object.create(arg) crée un nouvel objet dont le prototype est ce qui a été passé en argument.

Modifier Cela fait des années que cette réponse originale et maintenant Javascript prend en charge le mot clé class qui fonctionne comme vous vous attendez si vous venez à partir d'un langage comme Java ou C++. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes

33
Matt Crinklaw-Vogt

J'utilise cette technique de John Resig pour obtenir l'héritage et la substitution de méthode. Il vous permet même d'accéder à la méthode substituée en appelant this._super ().

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

4
Absolom

C'est une façon de procéder:

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/

3
Paddy