为什么覆盖本地方法是一个不好的想法?

3

我发布了一个问题,其中我使用Object.defineProperty覆盖了push。原始问题在这里。 我正在处理的代码在我的 codepen 上。

用户留下了以下评论:

覆盖本地方法(即原生的方法)无论是在原型还是在实例化的对象上都是不好的做法

为什么?

我决定覆盖push的原因是因为我需要在元素被推送后调用另一个方法。 我没有改变push所做的功能,只是让它在完成后触发一个事件。

我所做的是否有问题,如果有,有什么替代方案?


4
哇,我的评论引发了一个后续问题:D 我想你已经得到了答案。 - user6445533
@LUH3417 我讨厌做被认为是不正确的事情 :p 你激励我去寻找一个替代方案,更好的解决方法。 - BugHunterUK
1个回答

6
我能想到的一个问题是,现在你有一个非常特定于你的问题的推送方法,如果以后你需要正常的推送方法会怎样呢?你真的不知道这种情况是否会发生,但这可能会导致你以后不得不重构你的代码,以允许"普通推送"和"修改后的推送"。
我能想到的另一个问题是,如果你这样做,而且你不是唯一在编写代码的人,那么其他人可能不知道推送已被覆盖,并且不再遵循标准行为。
这可能会引起潜在的问题。你可能没有改变它太多,但是如果你所做的更改导致错误,你可能会让别人疑惑为什么一个(在他看来是正常的)推送会导致奇怪的行为。

那么有什么替代方案吗?我猜想是一个扩展了Array的对象? - BugHunterUK
4
@BugHunterUK,另一种选择是创建一个常规函数。 - elclanrs
@hansmaad,这是真的,即使对你自己来说也会有问题! 而且正如BugHunterUK所建议的那样,只需为此制作一个普通函数就可以了;-) - Dylan Meeus
1
你可以向原型添加自定义函数。就像这样:Array.prototype.pushAndCreateLI = function(){} - Rajesh
3
即使在这种情况下(不太可能但仍然)W3C决定创建一个名为pushAndcreateLI的函数,那也被认为是一种不好的做法。 - Dieterg
@Dieterg 这是真的。这就是为什么我使用了这样的大名字。理想情况下,如果我们正在做这样的事情,我们应该避免使用通用名称。相反,使用更大且自说明的名称,以满足您的要求。如果可能的话,我们甚至可以添加特殊的助记符,例如 Array.prototype._appId_pushAndCreateLI = function() {} - Rajesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接