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 に答える