【问题标题】:Best practice to organize extension methods in JavaScript在 JavaScript 中组织扩展方法的最佳实践
【发布时间】:2015-10-12 22:02:41
【问题描述】:

我有一堆 String 和其他 JavaScript 类型的扩展方法,它们现在驻留在全局命名空间中。 组织这些扩展方法的最佳实践是什么?我应该将它们封装在命名空间中吗?如果是,如何实现?谢谢!

【问题讨论】:

  • 只是好奇。如果你扩展了 String 的原型,你将如何使用命名空间?
  • 我认为如果它是一个属于 String 类的方法,你可以在那里声明它。 (

标签: javascript namespaces extension-methods


【解决方案1】:

Namespace your JavaScript if you need to refer to it elsewhere.

  // define your global namespace
  var Extensions = Extensions || {};

  // add modules to it
  Extensions.String = function() {
    var myPrivateProperty = 2;
    var myPublicProperty = 1;

    var myPrivateFunction = function() {
      console.log("myPrivateFunction()");
    };

    var myPublicExtension = function() {
      // this extension is being called, now what?
      console.log("myPublicExtension()");
    };

    // this object will be returned, giving access to public vars/methods
    return {
      myPublicProperty: myPublicProperty,
      myPublicExtension : myPublicExtension
    };
  }();

  console.log("Calling myPublicExtension()...");
  Extensions.String.myPublicExtension();

Anonymously scope JavaScript if you’re never going to call it elsewhere.

// This will keep your namespace clean
(function() {
    // here you can define your modules, functions, etc..

    var x = 123;
    console.log(x);

    // to make something global you can define it like
    window.globalVar = 5;
}());

或者您可以使用 prototype 扩展原生 javascript 对象,如下所示:

String.prototype.myExtension = function(p1, p2) {
    // here is your function
    return this + p1 + p2;
}

这样你不需要定义命名空间,你可以直接从你扩展的任何对象调用你的扩展:

var otherString = "mystring".myExtension(" is", " great!");
console.log(otherString);// mystring is cool

你可以用 javascript 中的任何对象做到这一点

编辑:

原型扩展不会污染全局命名空间,因为它们只能通过您扩展的对象访问。

如果您有许多扩展程序,请考虑将它们放入 extensions.js 之类的文件中,然后在您需要这些扩展程序时将其添加到您的页面中。这样 extensions.js 可以被浏览器缓存,加载速度更快

【讨论】:

  • 我正在使用原型来扩展方法,假设我有很多使用这种方式的扩展方法,如何组织它们?只是将它们留在全局命名空间中?这会污染全局命名空间吗?
【解决方案2】:

有两种方法:

  1. 封装在命名空间中(我认为保持事物整洁的最低限度)。自定义命名空间,即:

    window.MyNameSpace.trim = function(str) {
        return str.replace(/^\s+|\s+$/g, "");
    }
    

    (将 MyNameSpace 替换为单个字母!R 代表 Raphael,L 代表 Leaflet 等)

  2. 扩展原型!很多人会不同意这一点,但如果它是您的网站并且您不覆盖/与其他任何人的代码冲突,我认为没有什么坏处:

    String.prototype.trim = function () {
        return this.replace(/^\s+|\s+$/g, "");
    };
    

    我发现这个“更干净”,因为您不会传递不必要的参数......但同样,这是一个意见问题......这适用于任何内置类型。其余的我认为应该遵循#1

免责声明:代码来自This 帖子

【讨论】:

  • 想详细说明-1? (也许其中一个人不同意:))
  • 第一次受伤...但我不会尝试投票。 @codewarrior ...我把这个留给你,因为我们对你的代码有战争:)))
  • 我使用的是第二种方式,使用原型扩展,假设我有很多扩展方法使用这种方式,如何组织它们?只是将它们留在全局命名空间中?这会污染全局命名空间吗?
  • @codewarrior 多少是多少?如果有像“trim”这样的常用功能,我会将它们留在命名空间中。但是,如果其中一组相关,您可以将其作为单个对象/原型进入主命名空间。例如,如果您有“shuffle”、“randomize”、“removeDigits”等,这些不是 String 的常用方法,您可以这样做:String.prototype.myExtension.randomize()。这取决于上下文...
猜你喜欢
  • 1970-01-01
  • 2023-04-09
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 2010-09-05
  • 1970-01-01
相关资源
最近更新 更多