Как переписать функцию родительского прототипа в дочернем прототипе? - PullRequest
2 голосов
/ 21 апреля 2020

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

В приведенном ниже коде я пытаюсь переписать представление функции из моего класс Personn для отображения нового свойства Etudiant 'etablissement'.

function Personne(nom, age, sexe){
    this.nom = nom;
    this.age = age;
    this.sexe = sexe;
}

Personne.prototype.presentation = function() {
    return 'Bonjour, je suis ', this.nom + ', ' + this.sexe + ' de ' + this.age + ' ans.';
}

function Etudiant(nom, age, sexe, etablissement){
    Personne.call(this, [nom, age, sexe]);
    this.etablissement = etablissement;
}

Etudiant.prototype = Object.create(Personne.prototype);
Etudiant.prototype.constructor = Etudiant;

Etudiant.prototype.presentation = function (){
    return Personne.prototype.presentation.call(this) + ' Je travaille au ' + this.etablissement + '.';
};

let patrick = new Etudiant('patrick', 26, 'etoile de mer', 'Club');
console.log(patrick.presentation()); // this displays 'patrick,5651,etoile de mer, undefined de undefined ans. Je travaille au Club.'

1 Ответ

2 голосов
/ 21 апреля 2020

Проблема здесь:

Personne.call(this, [nom, age, sexe]);

С call вы передаете дискретные аргументы, а не массив аргументов. Либо измените его на apply, который принимает массив (или любой подобный ему массив):

Personne.apply(this, [nom, age, sexe]);

, либо делайте аргументы дискретными:

Personne.call(this, nom, age, sexe);

Live Пример:

function Personne(nom, age, sexe){
    this.nom = nom;
    this.age = age;
    this.sexe = sexe;
}

Personne.prototype.presentation = function() {
    return 'Bonjour, je suis ', this.nom + ', ' + this.sexe + ' de ' + this.age + ' ans.';
}

function Etudiant(nom, age, sexe, etablissement){
    Personne.call(this, nom, age, sexe);
    this.etablissement = etablissement;
}

Etudiant.prototype = Object.create(Personne.prototype);
Etudiant.prototype.constructor = Etudiant;

Etudiant.prototype.presentation = function (){
    return Personne.prototype.presentation.call(this) + ' Je travaille au ' + this.etablissement + '.';
};

let patrick = new Etudiant('patrick', 26, 'etoile de mer', 'Club');
console.log(patrick.presentation()); // this displays 'patrick,5651,etoile de mer, undefined de undefined ans. Je travaille au Club.'

Примечание: если вы собираетесь использовать функции конструктора и свойство prototype, в современном JavaScript (ES2015 +) вы можете сделать это более легко с синтаксисом class:

class Personne {
    constructor(nom, age, sexe){
        this.nom = nom;
        this.age = age;
        this.sexe = sexe;
    }

    presentation() {
        return 'Bonjour, je suis ', this.nom + ', ' + this.sexe + ' de ' + this.age + ' ans.';
    }
}

class Etudiant extends Personne {
    constructor(nom, age, sexe, etablissement) {
        super(nom, age, sexe);
        this.etablissement = etablissement;
    }

    presentation() {
        return super.presentation() + ' Je travaille au ' + this.etablissement + '.';
    }
}

let patrick = new Etudiant('patrick', 26, 'etoile de mer', 'Club');
console.log(patrick.presentation()); // this displays 'patrick,5651,etoile de mer, undefined de undefined ans. Je travaille au Club.'

Это создает фактически одно и то же (есть некоторые незначительные различия, основным из которых является то, что конструкторы не могут быть вызваны как обычные функции - чего вы обычно не хотите им быть). Важно отметить, что он по-прежнему использует прототип наследования, функции конструктора и свойство prototype; синтаксис упрощает настройку и делает его более декларативным.

...