如何使用插件扩展 javaScript 库

How to make a javaScript library extendable with plugins

假设我将此代码作为 javaScript 库:

(function(global) {

  var _private = function(x) {
    return x;
  };

  var doSome = function(x) {
    return x;
  };

  var extend = function(x) {
    // ?
  };

  // maybe some inits....
  var init= function(x) {
    // ?
  };

  var myLib = {
    doSome: doSome,
    extend: extend,
  };

  // CommonJS, AMD, script tag
  if (typeof exports !== 'undefined') {
    module.exports = myLib;
  } else if (typeof define === 'function' && define.amd) {
    define(function() {
      return myLib;
    });
  } else {
    global.myLib = myLib;
  }

})(typeof global !== 'undefined' ? global : window);

我想让这个库可以用插件扩展,使用私有方法的插件

您正在创建一个闭包,私有方法应该保持私有! 只有 myLib public 函数 应该 访问私有方法。

另一方面,您可以使用 eval() 来完成您想要完成的任务。

调用 eval() 时,您可以在本地作用域上创建一个函数,因此它可以访问 "private" 闭包方法。

看看这个例子:

var x = 2;
var myLib = (function() {
    var myLib = {
        extend: extend
    };

    var x = 1;

    function extend(name, fn) {
        myLib[name] = function() {
            eval('var f = '+fn.toString());
            return f.apply(this,arguments);
        };
    }

    return myLib;
})();
myLib.extend('a', function() { return x; });
myLib.a();

而不是 returning 2 它将 return 1。那是因为它在 eval() 函数调用的局部范围内创建函数。 这意味着它可以访问闭包的 "private" 成员。

我不建议使用此解决方案,除非您知道自己在做什么。因为你真的不应该玩太多 eval().