gpt4 book ai didi

javascript - 重新定义 JavaScript 类/对象构造函数以分配全局变量

转载 作者:行者123 更新时间:2023-12-01 01:31:13 26 4
gpt4 key购买 nike

我需要将一个钩子(Hook)插入 Youtube 的 iFrame API将生成的播放器分配给全局变量(我无法触及实际调用 API 的代码)。

API 的调用方式如下:

player = new YT.Player('player', {
height: '390',
width: '640',
videoId: 'M7lc1UVf-VE',
events: {
'onReady': onPlayerReady,
'onStateChange': onPlayerStateChange
}
});

我想做的是这样的:

YT.OldPlayer = YT.Player
YT.Player = function() {
window.YTPlayer = new YT.OldPlayer(arguments)
return window.YTPlayer
}
YT.Player.prototype = YT.OldPlayer.prototype

但由于某种原因,在我修改它之后,调用 new YT.Player() 会导致错误,而原始错误不会被调用。我知道正在调用新的构造函数,但对 YT.OldPlayer() 的调用中的某些内容会导致错误,因为 window.YTPlayer 未定义。我做错了什么?

最佳答案

这可能不是您正在寻找的答案,但作为公益广告:

What am I doing wrong?

我认为这里的主要问题是您试图 monkey-patch外部库上的功能。

这不是一个好主意,不仅因为它可能不会像您想象的那样工作,而且还因为它可能会在没有任何警告的情况下在将来崩溃。

  • 您正在修改库可能在内部使用的函数的功能
    库中可能还有其他功能做出假设并依赖于该函数的特定行为,除非您阅读整个库,否则您不会有太多可见性。

  • 即使有效,图书馆也可能随时更改其假设,恕不另行通知
    请记住,您可能不会测试此函数的所有用例,并且该库的作者不 promise 内部功能如何工作。他们可以更改代码以使用或停止使用相关函数、更改函数工作方式的内部结构等,而无需真正公布这些更改。这几乎肯定会以不可预见的方式破坏您的代码,因此您应该尽可能远离这种模式。

结论:如果可以,找到一种方法来解决问题,而不触及您无法控制的库的内部,您将为自己省去很多麻烦。

<小时/>

如果您仍然需要这样做

如果您仍然绝对需要这样做,那么您的问题似乎是您将参数作为类似数组的对象传递,这不是调用构造函数时得到的。

如果你可以使用ES6 rest parametersspread syntax ,你可以这样做:

YT.OldPlayer = YT.Player
YT.Player = function(...args) {
window.YTPlayer = new YT.OldPlayer(...args)
return window.YTPlayer
}
YT.Player.prototype = YT.OldPlayer.prototype

如果你不能使用其中任何一个,因为你need to support IE并且没有任何转译设置,例如,您需要找到解决方法:

YT.OldPlayer = YT.Player
YT.Player = function() {
window.YTPlayer = new (YT.OldPlayer.bind.apply(YT,arguments))
return window.YTPlayer
}
YT.Player.prototype = YT.OldPlayer.prototype

关于javascript - 重新定义 JavaScript 类/对象构造函数以分配全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53254485/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com