2012-04-10 2 views
2

У меня есть следующий код для мини-рамки. Как сделать «пуленепробиваемый» мой код, чтобы потенциальный делинквент-разработчик не нарушил его? Я кратко, что делает этот код в комментариях, и вот 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

Вообще говоря, вы не можете «пуленепробиваемый» JavaScript. Язык слишком разрешительный. Даже встроенные функции, предоставляемые браузером ('alert()', 'parseInt()' и т. Д.), Могут быть произвольно заменены. Как правило, лучшее, что вы можете сделать, - это обфускацию кода перед его развертыванием. – aroth

+0

@ я знаю, что нет кевлара, достаточно толстого, чтобы предотвратить его. но я хотел бы знать, есть ли лучший способ изолировать поломку. – Joseph

ответ

1

Если вы пытаетесь сделать ваш код от случайного interferance, то:

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

не то, как это сделать. Вы не знаете, что окно ссылки в глобальном контексте (оно не может существовать вообще), то только ссылки вы знаете, безопасно это, который должен ссылаться на глобальный объект, так:

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

безопаснее.

Ничто не может получить доступ к вашему коду внутри IIFE, поэтому он настолько же безопасен, как и javascript, но он, безусловно, небезопасен. Любая система, которая доставляет свой источник клиенту, по своей сути небезопасна.

+0

Я не говорил о IFFE. я имел в виду интерфейс 'kit.core.extend' и' core', который он предоставил. что «core» может быть изменен, поэтому любой разработчик, пытающийся быть просроченным, нарушит остальную часть кода. Я пытаюсь предотвратить это. – Joseph

0

Изучите использование defineProperty и его кузенов. С помощью этого вы можете точно настроить возможности свойств в общедоступном объекте и не допустить изменения их формы. Для получения полной информации см http://ecma262-5.com/ELS5_HTML.htm#Section_8.6

Смежные вопросы