防止覆盖所提供的内部功能的方法

时间:2012-04-10 06:15:38

标签: javascript plugins interface

我有一个迷你框架的代码。我如何“防弹”我的代码,以便可能的违法开发人员不会破坏它?我总结了代码在评论中的作用,这里是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外部函数的独立“副本”,所以无论他们做什么,它都不会影响其他扩展?

一个附带问题,如果我可以补充:是否有更好的方法/方法来构建此代码?

2 个答案:

答案 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