Как вызвать метод в классе из его замещенной реализации? - PullRequest
0 голосов
/ 07 декабря 2009

Hai,

Я пытаюсь понять несколько понятий в JavaScript. Рассмотрим следующий код:

function Person(name, age)
{
    this.name = name || "no name";
    this.age = age || "age not specified";
    this.printStr = function()
    {
        console.log("< " + this.name + ", " + this.age + " >");
    };
}

p = new Person("pranav", 26);
p.printStr = function()
{
    console.log("this works. also ...." + this.name);
};
p.printStr();

Я хочу вызвать реализацию 'printStr' в классе Person изнутри реализации функции 'printStr' в 'p'.

такой, что результат должен быть:

< pranav, 26 >
this works. also ....pranav

Есть идеи? :)

Ответы [ 3 ]

3 голосов
/ 07 декабря 2009

То, как ваш код настроен сейчас, вы не можете сделать это. Когда вы вызываете Person как конструктор, объект, который в итоге становится p, получает значение this Поэтому, когда вы определяете printStr в конструкторе, p получает атрибут с именем printStr. Затем вы перезаписываете его, когда назначаете вторую функцию.

Два варианта: без ответа делать то, что сделал паблочан - нужно назвать внутреннюю oldPrintStr. Другой вариант - использовать наследование прототипа:

function Person(name, age)
{
    this.name = name || "no name";
    this.age = age || "age not specified";
}
Person.prototype.printStr = function() {
    console.log("< " + this.name + ", " + this.age + " >");
};

Тогда вы можете сделать это:

p = new Person("pranav", 26);
p.printStr = function()
{
    Person.prototype.printStr.apply(this);
    console.log("this works. also ...." + this.name);
};
p.printStr();
2 голосов
/ 07 декабря 2009

Насколько я знаю, в JS нет реального подкласса, поэтому для этого вам, вероятно, следует сохранить старую функцию и затем заменить ее.

p = new Person("pranav", 26);
p.oldPrintStr = p.printStr;
p.printStr = function()
{
    p.oldPrintStr();
    console.log("this works. also ...." + this.name);
};
p.printStr();
0 голосов
/ 07 декабря 2009

Если вы не сохранили printStr Person, вы всегда можете создать временный объект Person исключительно для извлечения printStr и вызова его:

p.printStr = function()
{
    print("this works. also ...." + this.name);
    (new Person()).printStr.apply(this);
};

но я думаю, вам будет лучше, если вы сделаете оригинальный printStr Person доступным через прототип:

Person.prototype.printStr = function()
    {
        print("< " + this.name + ", " + this.age + " >");
    };

тогда вам не нужен временный объект или сохранение старой функции, и вы можете сделать:

Person.prototype.printStr.apply(this);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...