Javascript 如何使用继承类中的方法

Javascript 如何使用继承类中的方法,javascript,javascript-objects,Javascript,Javascript Objects,我已经实现了继承链车辆->机动->汽车: function Vehicle() { var m_name; this.setName = function(pName) { m_name = pName; }; this.getName = function() { return m_name; }; } function Motorized() { var m_started = false; th

我已经实现了继承链
车辆->机动->汽车

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()
(在函数中定义)时,我得到一个引用错误:未定义getName。我如何在我的子类
中使用内置的方法
getName()

,因为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中的事件处理程序,那么清楚地引用您正在编码的类可能会很有用,因为
这个
很容易变得模棱两可,至少从人的角度来看是这样的


不管怎样,使用
self
是否是一种糟糕的编码模式是我们讨论的话题;您的示例中的要点是,您需要调用<代码>自已.GETNAMEL()/<代码>或<代码> .GETNAMEL()/代码> ./P>我没有考虑在这里使用函数调用模式。谢谢。是的,
()
也丢失了,但它也会引发异常。方法
getName()
出现在
Motorized
Car
中,但是关键字
this
可能很棘手,因此这有助于解决调试问题。