如何使用插件扩展javaScript库

时间:2015-11-19 13:38:40

标签: javascript oop design-patterns module

假设我将此代码作为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);

我想使用插件,使用私有方法的插件

来扩展此库

1 个答案:

答案 0 :(得分:3)

您正在创建一个闭包,私有方法应该保密! 只有myLib个公共职能应该访问私有方法。

另一方面,您可以使用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();

而不是返回2,它将返回1。这是因为它在eval()函数调用的本地范围内创建了函数。 意味着它可以访问"私人"关闭的成员。

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