2017-06-14 44 views
0

我使用typescript來設計使用Dependencies注入設計模式概念的類。 注射器類的代碼裏面有一行代碼: car.apply(car,[new doors]); 我們假設要執行主類,那麼我們可以使用(依賴項,方法),因爲我們將它們作爲參數注入它們,但是.apply不會執行該函數! 那麼究竟發生了什麼?.apply方法如何處理(類和原型)

var car = function(){ 
 
    function car(doorsClass){ 
 
     this.doorsClass = doorsClass; 
 
\t \t this.color('red'); 
 
\t \t this.doorsNum(4); 
 
    } 
 
    car.prototype.color = function(color){ 
 
    \t console.log('Car color is '+color); 
 
    } 
 
    car.prototype.doorsNum = function(doorsNum){ 
 
    \t console.log('Car has '+this.doorsClass.doors(doorsNum)+' doors'); 
 
    } 
 
return car; 
 
} 
 

 
var doors = function(){ 
 
    function doors(){ } 
 
    doors.prototype.doors = function(num){ 
 
\t  return num; 
 
    } 
 
return doors; 
 
} 
 

 
car.apply(car, [new doors]);

+0

你的命名約定是可怕的,因此難以評論 - 但你肯定需要執行的(外)'M'功能,讓你的內心'M'到'apply' – Jamiec

+1

對不起,我已經更新了代碼,使其更具可讀性。感謝您的筆記兄弟。 –

回答

0

有幾件事你的代碼錯誤,主要是做與不執行你的模塊,這樣你的變量,它應該指出的構造實際上指向的模塊。

下一個大問題是,你不能在構造函數上調用apply來創建一個新的實例。有幾種解決方法,根據您的目標Javascript版本,in this Q/A,但下面的作品(我認爲)你的意圖。

var applyCtor = function(){ 
 
    var tempCtor = function() {}; 
 
    return function(ctor, args){ 
 
     tempCtor.prototype = ctor.prototype; 
 
     var instance = new tempCtor(); 
 
     ctor.prototype.constructor.apply(instance,args); 
 
     return instance; 
 
    } 
 
}(); 
 

 
var CarClass = (function(){ 
 
    function car(doorsClass){ 
 
     this.doorsClass = doorsClass; 
 
    } 
 
    car.prototype.color = function(color){ 
 
    \t console.log('Car color is '+color); 
 
    } 
 
    car.prototype.doorsNum = function(doorsNum){ 
 
    \t console.log('Car has '+this.doorsClass.doors(doorsNum)+' doors'); 
 
    } 
 
    return car; 
 
})(); //<-- execute your module 
 

 
var DoorsClass = (function(){ 
 
    function doors(){ } 
 
    doors.prototype.doors = function(num){ 
 
\t  return num; 
 
    } 
 
    return doors; 
 
})();//<-- execute your module 
 

 
// Apply the given ctor with arguments. 
 
var carInstance = applyCtor(CarClass,[new DoorsClass()]); 
 
carInstance.color('red'); 
 
carInstance.doorsNum(4);

+0

不錯,像魅力一樣工作。謝謝Jamiec,我真的很感激。 –

+0

嗨Jamiec,請問。 玩弄瞭解.apply的方法後,我進入這個 car.prototype.constructor.apply(car.prototype,[new doors]); 這段代碼會給我相同的結果,所以爲什麼在你的代碼中創建一個空函數,然後將所有的原型附加到它然後創建它的實例? 這背後有一個原因嗎? 謝謝 –

+0

我沒有寫它,我從鏈接的答案複製它。 – Jamiec