Как я могу использовать метод из унаследованного класса

У меня реализована цепочка наследования Vehicle -> Motorized -> Car:

function Vehicle()
{
    var m_name;

    this.setName = function(pName) {
        m_name = pName;
    };

    this.getName = function() {
        return m_name;
    };
}

function Motorized()
{
    var m_started = false;

    this.start = function() {
        m_started = true;
        console.log(getName() + " started");
    };
}

function Car()
{ }

//set up the inheritance chain
Motorized.prototype = new Vehicle();
Car.prototype = new Motorized();

// use
var lCar = new Car;
lCar.setName("Focus");
console.log(lCar.getName()); // Focus
lCar.start(); // ReferenceError: getName is not defined

Когда я вызываю lCar.start() (определено в функции Motorized), я получаю ReferenceError: getName is notdefined. Как я могу использовать унаследованный метод getName() в моем подклассе Motorized?


person Simon    schedule 06.07.2014    source источник


Ответы (1)


Потому что Javascript не знает, где искать ваш метод getName(). Вы можете уточнить синтаксис, объявив переменную self, которая всегда указывает на правильный объект, например:

function Vehicle()
{
    var self = this; // Vehicle
    var m_name;

    this.setName = function(pName) {
        self.m_name = pName;
    };

    this.getName = function() {
        return self.m_name;
    };
}

function Motorized()
{
    var self = this; // Motorized
    var m_started = false;

    this.start = function() {
        /*
         `self` is Motorized, with proto Vehicle, so
         has a getName() method.
         `this` instead is the object where you call
         start() from, i.e. Car, in the example down below.
         */
        self.m_started = true;
        console.log(self.getName() + " started");
    };
}

function Car()
{ }

//set up the inheritance chain
Motorized.prototype = new Vehicle();
Car.prototype = new Motorized();

// use
var lCar = new Car;
lCar.setName("Focus");
console.log(lCar.getName()); // Focus
lCar.start(); // Focus started

Обратите внимание, что в этом случае использование ключевого слова this вместо self во всем коде также сработало бы, но вы определенно не можете опустить его перед getName(). Кроме того, если вы планируете добавить больше кода позже, например, обработчики событий в jQuery, может быть полезно иметь четкую ссылку на класс, в котором вы кодируете, поскольку this может легко стать двусмысленным, по крайней мере, с человеческой точки зрения. Посмотреть.

В любом случае, является ли использование self плохим шаблоном кодирования или нет, является темой этого вопроса. ; дело в вашем примере в том, что вам нужно позвонить self.getName() или this.getName().

person Pietro Saccardi    schedule 06.07.2014