我有一个迷你框架的代码。我如何“防弹”我的代码,以便可能的违法开发人员不会破坏它?我总结了代码在评论中的作用,这里是a demo for clarification
var kit = (function() {
'use strict';
//internal cache
var internal = {
core: {}
}
//external interface for extensions
//let's say we provide a hook for error handling from the core
var external = {
core: {
error: {
addListener: function(callback) {
callback();
}
}
}
}
//externally available options
var core = {
//build extension by creating an instance of the passed function
//providing it the core interface, and
//then store the instance in the cache
extend: function(extensionName, extensionDefinition) {
var newExtension = new extensionDefinition(external.core)
internal.core[extensionName] = newExtension;
}
};
//expose
return {
core: {
extend: core.extend
},
_internal: internal,
_external: external
}
}());
//let's say two developers built these extensions
//developer1 builds his code
kit.core.extend('extension1', function(core) {
core.error.addListener(function() {
alert('test');
})
//developer1 intentionally kills the whole error interface
core.error = null;
});
//now, the other scripts cannot use the error interface
//because some delinquent developer killed it
kit.core.extend('extension2', function(core) {
//core.error is no more!
core.error.addListener(function() {
alert('test');
})
});
我该如何做到这一点,以便每个扩展都有core
外部函数的独立“副本”,所以无论他们做什么,它都不会影响其他扩展?
一个附带问题,如果我可以补充:是否有更好的方法/方法来构建此代码?
答案 0 :(得分:1)
如果您想让代码免于意外干扰,那么:
(function(window, undefined) {
…
}(window));
不是怎么做的。您不知道全局上下文中的 window 引用(它可能根本不存在),您知道的唯一引用是这个,必须引用全局对象,所以:
(function(global, undefined) {
…
}(this));
更安全。
没有什么可以在IIFE中访问你的代码,所以它和javascript一样安全,但肯定不安全。任何将其源提供给客户端的系统本质上都是不安全的。
答案 1 :(得分:0)
研究使用defineProperty及其表兄弟。通过这种方式,您可以微调公共对象中属性的功能,并防止任何人更改它们。有关完整的详细信息,请参阅http://ecma262-5.com/ELS5_HTML.htm#Section_8.6