2016-09-06 2 views
1

apply()を使用して関数を呼び出そうとしていますが、ブラケット表記でvarを渡すとそれ以上は機能しません。なぜこれはうまくいかないのですか?おかげJavascript apply()がブラケット表記でvarと一緒に動作しない

window.video['play'] = OK window.video.play = OK obj[p[i]] = not OK <= something like this I'd like to use

var obj = window; 
var prop = 'video.play'; 

var p = prop.split('.'); 
for (var i = 0; i < p.length; i++) { 
    obj = obj[p[i]]; 
} 

var orig = obj; // problem here with obj: window.video['play'] = OK, but obj[p[i]] = not OK 
obj = function() { 
    var ar = Array.prototype.slice.call(arguments); 
    console.log(ar); // not work! 
    orig.apply(this, ar); 
}; 

はほぼ同じですが、この作品:

var orig = window.video.play; 
window.video.play = function() { 
    var ar = Array.prototype.slice.call(arguments); 
    console.log(ar); // work! 
    orig.apply(this, ar); 
}; 
+1

obj = obj [p [i]]; ' – Dekel

+2

@Dekel:それは正しいことだと思う。 –

+2

正確には 'console.log(ar); //うまくいかない! 'mean? –

答えて

2

TLDを; DR:あなたがvideo.playの値を変更したい場合は、明示的に持っているそれに割り当てますobjvideo.playと同じ値を持つからといって、objに代入すると、video.playの値が変更されるわけではありません。


objは変数である。変数に新しい値を代入しても、新しい値を別の変数またはプロパティに魔法のように割り当てることはありません。いくつかのASCIIアートを手に入れることができます。我々は別の変数に機能を割り当てた場合、例えば、

      +--------------+      
+----+-----------+  | Object#123 |      
|foo | ref:123 *+------>+------+-------+  +--------------+ 
+----+-----------+  | fn | *---+---->| Function#456 | 
         +------+-------+  +--------------+ 

これは、メモリ内の次のオブジェクト構造を作成

var foo = { 
    fn: function() { 
    console.log(foo); 
    }, 
}; 

で始まります

var bar = foo.fn; 

次いでbar直接関数オブジェクトを指します。

     +--------------+      
         | Object#123 |      
        +--->------+-------+  +--------------+ 
        | | fn | *--+----->| Function#456 | 
+----+-----------+ | +------+-------+  +--------------+ 
|foo | ref:123 *+--+        ^  
+----+-----------+         |  
|bar | ref:456 *+------------------------------------+  
+----+-----------+            

新しいbarはまさにそれを行います割り当てる:それは別の値にbarポイントを行いますが、それはfooまたはfoo.fnへの影響はありません。

bar = function() { 
    console.log('bar'); 
}; 

ご覧のとおり、foo.fnは元の関数を指しています。

      +--------------+      
         | Object#123 |      
        +--->+------+-------+  +--------------+ 
        | | fn | *---+---->| Function#456 | 
+----+-----------+ | +------+-------+  +--------------+ 
|foo | ref:123 *+--+           
+----+-----------+  +--------------+      
|bar | ref:789 *+------>| Function#789 |      
+----+-----------+  +--------------+     
+0

魔法の単語がポインタです、thx 。 – dmj16

+0

問題の非常に良い説明。この特定の質問に対して単純な解決法を追加することができれば、関数参照を取得するループ内で 'parent = obj;'を使って最後の親オブジェクトを階層に連続的に格納することによって、 'video.play'関数を正しく上書きすることができます'parent [p [p.length - 1]] = ...'を使って上書きします。この場所に私たちを連れて行った奇妙なデザインがあるような気がします。 – Thor84no

+0

私はprobemがsthになる可能性があると感じました。ポインタや上書きとは関係がありますが、この解説まではわかりませんでした。 Thor84no、あなたの提案のためにthx、私はそれを試してみます... – dmj16

関連する問題