我正在重构我的代码。我无法确定如何实现我拥有的几个实用程序功能。 具体,如果某些功能在我的个人命名空间中更好或直接扩展js对象。
扩展原生JavaScript对象的示例
(这是正确的术语吗?)。
String.prototype.prettyDate = function(){
return (this.substr(5,2) + '/' + this.substr(8) + '/' + this.substr(0,4));
}
var myString = "2010-12-27";
//logs 12/27/2010
console.log(myString.prettyDate);
使用我自己的命名空间的示例
var myNamespace = (function(){
var my = {};
my.prettyDate = function ( dateStr ){
return (dateStr.substr(5,2) + '/' + dateStr.substr(8) + '/' + dateStr.substr(0,4));
}
return my;
}());
var pretifiedDate = myNamespace.prettyDate('2010-12-27');
//logs 12/27/2010
console.log(pretifiedDate);
答案 0 :(得分:7)
几乎从不,因为:
/可能与其他图书馆发生冲突
b /扩展函数通过运算符中的作为属性进行迭代,除非被hasOwnProperty(不常用)过滤掉,否则会产生问题
你可以为小型的单脚本工作证明这一点,但只有当你200%确定没有人时,才会尝试在某处重复使用该代码。在这种情况下,仅将其用于跨越代码的多个模块的功能。使用trim()扩展String - 确定,使用prettyDate()扩展String - 可疑,使用displayAsPageHeader()扩展Object - 可怕。
所以,几乎总是。
答案 1 :(得分:4)
观看此视频:
John Resig认为扩展本机对象是一种灾难,特别是当一个框架或应用程序可能会发展成比最初预期更多的东西时。
答案 2 :(得分:2)
不幸的是,这个问题没有“正确”的答案。这是一个很好的讨论,但我担心它会在这里关闭。原始对象是否应该扩展是一个主观的辩论,如果你接受它有条件的回答“什么时候?”是“取决于”。
如果您可以控制它的使用以及它是否会与其他代码发生碰撞,那么您根本没有理由不这样做。这可能非常方便,可能会显着减少代码大小。
如果扩展本机对象存在真正的问题,那么当您的扩展程序旁边有其他代码运行时,可能会使用相同的属性名称进行不同的扩展,或者可能在不保护的情况下不小心使用for(var i in obj)
反对扩展原型链。
答案 3 :(得分:1)
好的......我不是这方面的专家,但几乎从不! 你做的事情在命名空间内更安全。如果您遵循模块模式http://www.yuiblog.com/blog/2007/06/12/module-pattern/
,一切正常然而,有一些小技巧可以让我们避免覆盖其他命名空间。每个例子:
var myNamespace = {}; //my namespace, unsafely written
//Better solution
if(typeof myNamespace === 'undefined'){
var myNamespace = {};
}
//Shorter solution
var myNamespace = myNamespace || {};
答案 4 :(得分:0)
这取决于您对正在运行/加载的代码的控制程度:
如果全部在您的控制之下,扩展内置对象没有任何问题,JavaScript旨在能够做到这一点。唯一的问题是,当两个库更改相同的内容时,您可能会遇到意外问题。幸运的是,你不会对自己这样做,对吗?
如果你不知道/不知道,命名空间更安全,虽然笨拙和冗长。这总是更安全。
就个人而言,我更喜欢第二种选择,因为我不喜欢过于冗长的代码和命名空间看起来很有趣。