2

我有一个迷你框架的以下代码。我如何“防弹”我的代码,以便可能的拖欠开发人员不会破坏它?我在评论中总结了代码的作用,这里有一个演示以供澄清

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外部函数“副本”,所以无论它们对它做什么,它都不会影响其他扩展?

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

4

2 回答 2

1

如果您试图使您的代码免受意外干扰,那么:

(function(window, undefined) { 
  …
}(window));

不是怎么做的。您不知道全局上下文中的窗口引用(它可能根本不存在),您知道唯一安全的引用是this,它必须引用全局对象,所以:

(function(global, undefined) { 
  …
}(this));

更安全。

在 IIFE 中没有任何东西可以访问您的代码,因此它和 javascript 一样安全,但它肯定不安全。任何将其源提供给客户端的系统本质上都是不安全的。

于 2012-04-10T06:28:43.007 回答
0

研究使用 defineProperty 及其表兄弟。有了这个,您可以微调公共对象中属性的功能,并防止任何人更改它们。有关完整的详细信息,请参阅http://ecma262-5.com/ELS5_HTML.htm#Section_8.6

于 2012-04-10T06:21:26.747 回答