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
可能很棘手,因此这有助于解决调试问题。