2013-10-18 107 views
0

我想在继承,原型和回调函数的Javascript中使用OOP。你能看看我的JSfiddel http://jsfiddle.net/Charissima/5g6GV/。 第一个问题已在Javascript OOP - inheritance and prototyping中解决,但不幸的是回调函数不再工作。Javascript OOP - 继承,原型,回调函数

 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)); 
     };      

     var myText; 
     car = new Car; 
     raceCar = new RaceCar;   

     car.putTotalDistance(200); 
     myText = 'car totalDistance = ' + car.drive(10) + ' - ok<br>'; 

     raceCar.putTotalDistance(200); 
     myText += 'raceCar totalDistance before drive = ' + raceCar.getTotalDistance() + ' - ok<br>'; 
     myText += 'raceCar totalDistance after drive = ' + raceCar.drive(10) + ' - ok<br><br>';              

     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>' 
     } 

     document.body.innerHTML = myText; 
+0

我没有看到你的代码使用任何回调。请直接在您的问题中直接陈述实际问题,而不是依赖到其他站点的链接(jsfiddle并非总是可用)。描述所需的行为和实际行为。 “不再工作”的意思实际上是指,例如,浏览器的控制台是否存在错误,或什么也没有发生,或者发生了什么事情,但是这是错误的事情? – nnnnnn

+0

我不想使用直接调用,但将函数放在数组中: var drivingFunctions = [car.drive,raceCar.drive]; 第一个是基类,第二个是继承类。 现在我打电话给drivingFunctions [0](10),结果是NaN,因为this.totalDistance是未定义的,我不知道为什么。 –

+0

...然后我打电话给drivingFunctions [1](100),甚至值,我得到一个异常,错误文本为“this.parent is undefined”。 我希望我的解释清楚。 –

回答

2

你已经把两个功能在阵列中,所谓时,this得到改变。 你可以使用函数bind

var drivingFunctions = [car.drive.bind(car), raceCar.drive.bind(raceCar)]; 

下面是一个例子,以帮助您了解:

function Man(name){ 
    this.name = name; 
    this.getName = function(){ 
     return this.name; 
    }; 
} 
var man = new Man('toto'); 
var a = [man.getName]; 
console.log(a[0]());//undefined 
a.name = 'titi'; 
console.log(a[0]());//titi, because this refers to the array. 
+0

我提高了这个答案,因为它解决了OP的问题。然而问题是没有实际意义的:我看不到一个真实世界的场景,在这个场景中,你可以对数组中的方法调用进行对象处理,而不必诉诸于更多有效且优雅的解决方案,而不会混淆这个'this'上下文。 –

+0

@JoeMinichino你是对的,我只是向OP展示问题所在。 –

+0

关于这个话题,我写了一个小型的库,用***这个上下文***故意***,检查出来[这里](https://github.com/techfort/paladin) –