2016-08-03 11 views
0

はJS忍者の秘密から、少し例を次に示します。奇妙なJavaScript関数の挙動

function addMethod(obj, methodName, fn) { 
    const old = obj[methodName]; 


    obj[methodName] = function() { 
    if (fn.length === arguments.length) { 
     return fn.apply(this, arguments); 
    } else if (typeof old === 'function') { 
     return old.apply(this, arguments); 
    } 
    }; 
} 

let ninja = {}; 

addMethod(ninja, 'whatever', a => console.log(`one: ${a}`)); 
ninja.whatever(1); 
addMethod(ninja, 'whatever', (a,b) => console.log(a, b)); 
ninja.whatever(2, 2); 
addMethod(ninja, 'whatever', (a,b, c) => console.log(a, b, c)); 
ninja.whatever(3); 
console.log(ninja); 
console.dir(addMethod); 

、なぜこの機能

a => console.log(`one: ${a}`) 
として、この変数

const old = obj[methodName]; 

仕事で私は理解できません

このファンクションが必要であると思います。

(a,b) => console.log(a, b) 

答えて

1

すべて「古い」の機能を維持する....あなたが得るものです

function() { 
    if (fn.length === arguments.length) { 
     return fn.apply(this, arguments); 
    } else if (typeof old === 'function') { 
     return old.apply(this, arguments); 
    } 
} 

するobj[methodName]を設定する前に、それはオールでの書き込みだったので、 'addMethod'を呼び出すたびに別の変数 'old'が作成されます( 'addMethod'関数本体で区切られたスコープ内でのみアクセス可能)

+0

、ありがとう。そのような行動は私にとっては珍しいことです –

0

あなたのaddMethod機能が

+0

はい、わかります。私はなぜこの 'ninja.whatever(2、2);'が古い変数を上書きしないのかを意味します。 –