2013-10-17 145 views
0

我想在继承和原型的Javascript中使用OOP。请你看看我的JSFiddel http://jsfiddle.net/Charissima/daaUK/。最后一个值是问题,谢谢。 我不明白为什么使用raceCar的驱动器没有得到totalDistance,哪一个set putTotalDistance。Javascript OOP - 继承和原型

 function Car() { 
      var that = this; 

      this.totalDistance = 0; 

      this.putTotalDistance = function(distance) { 
       that.totalDistance = distance; 
      }; 

      this.getTotalDistance = function() { 
       return this.totalDistance;  
      }; 

      this.drive = function(distance) { 
       that.totalDistance += distance;  
       return that.totalDistance; 
      }; 

      this.privateFunc = function() { 
       return 'car ' + this.totalDistance; 
      }; 
     }; 


     function RaceCar (initialDistance) { 
      var that = this; 

      this.prototype = new Car(); 
      this.drive = function(distance) { 
       return that.prototype.drive(2*distance); 
      }; 

      this.privateFunc = function() { 
       return 'raceCar ' + that.getTotalDistance(); 
      }; 
     }; 


     RaceCar.prototype = new Car(); 

     car = new Car; 
     raceCar = new RaceCar;   


     car.putTotalDistance(200); 
     alert('car totalDistance = ' + car.drive(10) + ' - ok'); 

     raceCar.putTotalDistance(200); 
     alert('raceCar totalDistance before drive = ' + raceCar.getTotalDistance() + ' - ok'); 
     alert('raceCar totalDistance after drive = ' + raceCar.drive(10) + ' Why not 220?');     

回答

0

试试这个:

function Car() {  
    this.totalDistance = 0; 
}; 

Car.prototype.putTotalDistance = function(distance) { 
    this.totalDistance = distance; 
}; 

Car.prototype.getTotalDistance = function() { 
    return this.totalDistance;  
}; 

Car.prototype.drive = function(distance) { 
    this.totalDistance += distance;  
    return this.totalDistance; 
}; 


function RaceCar() {}; 
RaceCar.prototype = new Car(); 
RaceCar.prototype.parent = Car.prototype; 
RaceCar.prototype.drive = function(distance) { 
    return this.parent.drive.call(this, (distance * 2)); 
}; 

raceCar = new RaceCar(); 
raceCar.putTotalDistance(200); 

document.body.innerHTML = 'raceCar totalDistance after drive = ' + raceCar.drive(10); 

编辑:

正如指出了其他的答案之一,主要的问题是设置prototypeconstructor内。相反,分开设置它。在上面的代码中,我将汽车原型链接到赛车原型父级属性,然后使用调用触发父级驱动功能,以便将函数的上下文设置为赛车(通过this),然后将参数传递。

+1

为什么? *如果它没有解释它,那么尝试这个*答案是非常不令人满意的。 – Bart

+0

够公平的。我会添加一些东西。 – Todd

0

谢谢你,这工作正常,但不幸的是我需要的另一个功能是现在打破。我创建了一个新的jsfiddle:http://jsfiddle.net/Charissima/5g6GV/

car.putTotalDistance(0);    
raceCar.putTotalDistance(100); 
var drivingFunctions = [car.drive, raceCar.drive]; 

myText += drivingFunctions[0](10) + '<br>'; 
try { 
    myText += drivingFunctions[1](100) + '<br>';     
} 
catch(err) { 
    myText += err + '<br>' 
} 
+0

-1你不在这里回答你的问题。 –

+0

第一个问题得到解答,这就是我回答的原因,对不起,如果这是错误的。 –

+0

然后只是提出一个新问题,不要犹豫,因为它是相关的,所以在这个问题上建立一个链接。要链接到您的问题,请点击标签下面的“共享”,然后点击编辑/关闭/标志旁边的。答案必须是答案,这就是Stackoverflow的工作方式。 –

0

首先var that = this;是不必要的。在对象上下文中,this将始终引用该实例。

你也不想在它自己的构造函数中设置对象原型。

如果你想访问一个类的原型,不要试图通过实例访问它。

The update fiddle

function RaceCar (initialDistance) { 
    //var that = this; 
    //this.prototype = new Car(); 

    this.drive = function(distance) { 
     return RaceCar.prototype.drive(2*distance); 
    };   
}; 

// This correctly sets the prototype 
RaceCar.prototype = new Car();