2010-08-26 59 views
2

你会考虑通过原型来扩展原生元素吗?我看到一些框架如Prototype这样做,所以我开始怀疑我是否也敢这么做。通过原型在JavaScript中扩展本地元素?

我很担心像addClassName这样的事情发生,并且使得它在未来发生碰撞,这种方式我不能解决任何其他方式,而不是重写软件并要求模块作者执行相同的操作。

+0

https://stackoverflow.com/questions/14034180/why-is-extending-native-objects-a-bad-practice的潜在副本 – 2018-02-25 20:57:26

回答

2

我不会因为恕我直言,它可能很快就会发生碰撞,并创建一个很难被发现的潜在错误。

我反正也延长一些基本的简单的本地JavaScript对象,如String.trim,我反正小心总是测试,看它是否已经存在,通过一个简单的测试,如果:

if(!String.prototype.trim) 
    String.prototype.trim = function() { return this.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); } 

你可以用addClassName做同样的事情。 不同之处在于用String.trim这样的简单函数来做这件事,将来很可能会导致问题,因为即使浏览器引擎有String.trim(实际上FF有它),那么这样的函数也会精确到做我的String.trim所做的事情,这样你就不会在你的Web应用程序工作流程中看到任何差异。

像覆盖querySelectorAll这样更复杂的函数可能会导致浏览器实现它和实现之间的差异。例如:返回的元素的顺序可能不同,浏览器函数返回一个集合,而你的一个数组和其他问题。所以当你在实现querySelectorAll的浏览器上运行你的webapp时,它可能会导致你的webapp不能按预期工作,并且在那里试着找出bug!

也许querySelectorAll不是最好的例子,但我希望我解释了这个概念。