如何使用插件扩展 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()
.
假设我将此代码作为 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()
.