我正在重构代码。我很难确定如何确切地实现我拥有的几个实用程序功能。 具体来说, ,如果某些功能在我的个人名称空间中更好或直接扩展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);

要考虑的问题

  1. 什么时候合理地将实用程序插入本机JavaScript对象?
  2. 我该如何确定何时在我自己的名称空间中最好的情况更好?
有帮助吗?

解决方案

  1. 几乎从来没有,因为:

    A/可能与其他库发生冲突

    B/扩展功能由迭代作为属性 运算符,除非由HasownProperty滤除(不常用),否则会提出问题

    您可以为小型单脚本作品证明这一点是合理的,但是只有当您200%确定没有人,永远不会尝试在某个地方重复使用该代码。在这种情况下,仅将其用于跨代码的一个模块的功能。使用trim()扩展字符串 - 好的,用prettydate()扩展字符串 - 可疑的,displayaspageheader() - 恐怖。

  2. 所以,几乎总是。

其他提示

看这个视频:

John Resig认为,扩展本地对象是灾难的秘诀,尤其是当框架或应用程序可能成长为远远超过最初预期的东西时。

不幸的是,这个问题没有“正确”的答案。这是一个很好的讨论,但我担心它会在这里关闭。本机对象是否应该完全扩展是一个主观的辩论,如果您接受有条件的“何时?”的答案可以。是“取决于”。

如果您控制了它的使用以及是否会与其他代码相撞,则实际上没有理由。它可能非常方便,可能会大大减少代码大小。

扩展本机对象存在真正的问题的地方是,当您与扩展名一起运行其他代码时,可能会期望使用相同的属性名称进行不同的扩展名,或者可能会不断地使用 for(var i in obj) 不防止扩展原型链。

好的...我不是专家,但几乎从来没有!您所做的事情在命名空间内更安全。如果您遵循模块模式,一切正常 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 || {};

这取决于您对正在运行/加载的代码有多少控制:

  1. 如果一切都在您的控制之下,则扩展内置对象没有错,JavaScript旨在执行此操作。唯一的问题是,当两个库更改相同的内容时,您可能会遇到意外的问题。幸运的是,您不会对自己这样做,对吗?

  2. 如果您不知道,命名空间虽然笨拙且详细。这总是更安全。

就个人而言,我更喜欢第二种选项,因为我不喜欢过度的冗长代码和名称空间看起来很有趣。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top