最近,我在使用Liferay时遇到了以下代码(来自liferay.js):
....
if (!Liferay._ajaxOld) {
Liferay._ajaxOld = jQuery.ajax;
}
if (Liferay._ajaxOld) {
jQuery.ajax = function(options) {
if (Liferay.Util) {
options.url = Liferay.Util.getURLWithSessionId(options.url);
}
return Liferay._ajaxOld(options);
};
}
....如您所见,上面的代码覆盖了函数"jQuery.ajax“来修改"options.url”。有人可能会说,这是语言的一种优势,因为我们可以轻松地覆盖和自定义现有的函数。
但是,我认为这种能力很容易导致问题。例如,我的代码可以覆盖相同的函数"jQuery.ajax“来修改"options.url”,这与上面的代码不同。因此,任何期望由"liferay.js“定义的行为的代码都可能不再像预期的那样工作。
我认为这是语言的一个弱点,因为它没有提供适当的封装。对于该领域语言的这一特性/能力,有什么共识?
发布于 2011-11-10 22:31:35
我认为这真的取决于你问谁。Javascript绝不是一种完美的语言,但就像对私有变量的抽象一样,这可能是一件好事,也可能是一件坏事,取决于具体情况。
如果您正在使用一个库,并且希望覆盖一个函数,那么这是一件好事,如果您是一个库或函数的作者,并且有人以您不想要的方式使用您的代码,那么它就不是。
发布于 2011-11-10 22:41:14
这是一种力量。如果您正在修改一个现有的函数,那么您就知道该修改后的函数所做的事情,并且知道如何使用它与规范不同,而不是遵循使用旧规范的代码。
这并不是说它会覆盖解释器本身中的函数,因此其他网页将使用修改后的规范。
这样做的一个好处是,您可以修复存在于CDN上的库中的小错误,而不需要保存和服务库本地的整个副本。
这可能有益的地方之一是内容安全策略(,CSP)环境。由于jQuery动画通常使用CSP环境中可能禁止的样式属性,因此您可能希望重写一些jQueries函数,以指向外部CSS3表并分配类属性。因此,您可以在CDN上托管的大型库中继续使用jQuery,在本地托管一个小型js,它以不违反您的CSP的方式重新定义违反CSP的jQuery函数,并使用调用这些函数的打包小部件,而不需要修改打包的小部件。
https://softwareengineering.stackexchange.com/questions/119310
复制相似问题