2017-10-05 180 views
0

我有一個關於foor循環的問題。 爲什麼我的輸出每次都是「C」?for循環,元素綁定

function Dummy(){} 
 

 
Dummy.prototype.a = function(){ console.log("Hello from A"); }; 
 
Dummy.prototype.b = function(){ console.log("Hello from B"); }; 
 
Dummy.prototype.c = function(){ console.log("Hello from C"); }; 
 

 
function hooks(obj){ 
 
\t for(method in obj){ 
 
    original = obj[method]; 
 
    \t obj[method] = function(){ 
 
    \t console.log("Overrid %s", method); 
 
     original(); 
 
    }; 
 
    } 
 
} 
 

 
var instance = new Dummy(); 
 
hooks(instance); 
 

 
instance.a(); 
 
instance.b(); 
 
instance.c();

我會創造一個hookable中間件

+0

找到了解決辦法,https://stackoverflow.com/a/7269313/5781499 但是,任何人都可以解釋,爲什麼?感謝 – Marc

+0

見https://stackoverflow.com/questions/750486/ –

回答

1

這裏是解決方案代碼: 這樣做的原因是,當你分配的功能,以「原始」變量,它會永遠參考上一分配,因爲'原始'變量在全局範圍內聲明。

function Dummy(){} 

Dummy.prototype.a = function(){ console.log("Hello from A"); }; 
Dummy.prototype.b = function(){ console.log("Hello from B"); }; 
Dummy.prototype.c = function(){ console.log("Hello from C"); }; 

function hooks(obj){ 
    for(method in obj){ 
     (function(original, method) { 

      obj[method] = function(){ 
       console.log("Overrid %s", method); 
       original(); 
      }; 
     })(obj[method], method) 
    } 
} 

var instance = new Dummy(); 
hooks(instance); 

instance.a(); 
instance.b(); 
instance.c(); 
+1

儘管這樣做,但@MackCope的答案簡單得多:只需添加'let's。 –

0

你只需要確保聲明變量。 「方法」和「原創」從未被宣佈過。請參見下面的工作示例:

function Dummy(){} 
 

 
Dummy.prototype.a = function(){ console.log("Hello from A"); }; 
 
Dummy.prototype.b = function(){ console.log("Hello from B"); }; 
 
Dummy.prototype.c = function(){ console.log("Hello from C"); }; 
 

 
function hooks(obj){ 
 
\t for(let method in obj){ 
 
    let original = obj[method]; 
 
    \t obj[method] = function(){ 
 
    \t console.log("Overrid %s", method); 
 
     original(); 
 
    }; 
 
    } 
 
} 
 

 
var instance = new Dummy(); 
 
hooks(instance); 
 

 
instance.a(); 
 
instance.b(); 
 
instance.c();

+0

謝謝,在我的例子中,我忘記了這一點。 我在上面的帖子中的評論是我需要的。 – Marc