Javascript apply() 不适用于括号表示法中的 var

Javascript apply() not working with var in bracket notation

我想使用 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);
};

tld;dr:如果你想改变video.play的值,那么你必须显式地赋值给它.仅因为 objvideo.play 具有相同的值并不意味着分配给 obj 将更改 video.play.

的值

obj 是一个变量。为变量分配新值并不会神奇地将新值分配给另一个变量或 属性。让我们来一些 ASCII 艺术。

让我们从

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

这会在内存中创建以下对象结构:

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

如果我们将函数分配给另一个变量,例如

var bar = foo.fn;

然后bar直接指向函数对象

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

现在,分配一个 newbar 就可以做到这一点:它会使 bar 指向另一个值,但它不会对 foofoo.fn 的任何影响:

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

可以看到,foo.fn仍然指向原来的函数:

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