2013-07-26 2 views
2

Я создаю плагин jQuery, который имеет функцию расширения, позволяющую вам по существу создавать плагины для плагина.Динамически создавать частные методы в JavaScript

http://jsfiddle.net/eeBEJ/1/

Если вы посмотрите на скрипку примере вы увидите $.fn.wPluginTest.extend функцию, которая позволяет передавать в функции продлить прототип. Есть ли способ расширить локальное пространство имен, чтобы добавить частные методы?

Так, например, любые функции, переданные с _ спереди, будут установлены как частные и недоступны публично через объект PluginTest.

ответ

2

В javascript-объектах нет частной собственности, и я бы сказал, что это прекрасно, если бы они просто с префиксом подчеркивания.

Однако, вы можете попробовать:

$.fn.wPluginTest.extend = function(funcs) { 
    var proto = PluginTest.proto, 
     priv = Object.create(proto); // a private namespace inheriting from proto 
    for (func in funcs) { 
     if (func.charAt(0) != '_') 
      PluginTest.prototype[func] = funcs[func].bind(priv); 
     else 
      priv[func.slice(1)] = funcs[func]; 
//     ^^^^^^^^^ not sure, might be confusing 
    } 
} 

Тем не менее, эти функции не будут иметь доступ к PluginTest например, они призвали - они статически связаны с объектами прототипа - так это, наверное, плохо идея.

Если какой-либо плагин нуждается в реальной приватности, он должен использовать переменную область обзора самостоятельно.

+0

Хм, да, возможно, мне лучше подойти к этой проблеме с другой стороны и просто иметь какие-либо функции, начинающиеся с '_' return' null' или что-то в этом роде. Все призывы к плагину все равно проходят через зону геттера/сеттера. Благодарю. – Rob

+0

Думаю, вам не стоит беспокоиться о проблеме вообще. Если один из плагинов плагинов нуждается в частных функциях, он должен сам их охватить; и в противном случае вы просто копируете общедоступные методы. – Bergi

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