Позже добавьте другие функции в класс без использования .prototype - PullRequest
2 голосов
/ 04 ноября 2010

Как мне ссылаться на все функции, добавленные в класс после того, как класс был построен ? (Возможно в виде массива) и без использования prototype.

Я создал класс foo() и хотел бы добавить функциональность для добавления новых функций это может быть использовано позже.

var f = new foo();

1010 * тогда *

f.addfunc('bar',function(){/*code*/});

, чтобы f.bar(); можно было использовать позже.

Экспорт (?) Функций с помощью foo.__func_expose(funcname , function ); не работает.
(вероятно, я делаю это неправильно.) Кажется, есть ошибка. (подробности см. ниже).

Цель состоит в том, чтобы иметь массив, содержащий все добавленные и фактические функции, чтобы его можно было вызывать / заменять позже.

Реально ли в javascript выставлять новые имена функций из публичной функции?

Я бы хотел достичь чего-то вроде

var MyExtendedFoo = foo();
MyExtendedFoo.__func_add("bar",(function (a, b){
    alert('called : anon-func-we-named-bar'); return 2+a+b;}));
MyExtendedFoo.bar(1,3); // <---this does not work.
    // It should alert a message, then return 6.

Фактический код на данный момент

function foo(){
  // we store reference to ourself in __self
  this.__self = arguments.callee;
  var self = arguments.callee;

  // array that holds funcname , function
  if (!self.__func_list_fname) self.__func_list_fname = [];
  if (!self.__func_list_func) self.__func_list_func = [];

  // allow foo.__func_expose(); register to public
  self['__func_expose'] = function(){
    var self = __self;
    for(var i=0;i<self.__func_list_fname.length;i++){
      self[''+self.__func_list_fname[i]+''] = self.__func_list_func[i];
     // <---This part seems wrong. How do I do it?
    };
  return __self.__func_return();
  };

  // allow foo.__func_add( funcname , function );
  self['__func_add'] = function(f,v){
    var self = __self;
    self.__func_list_fname.push(f);
    self.__func_list_func.push(v);
    // tell itself to expose the new func as well as the old ones.
    return __self.__func_expose();
  };

  // build obj from known list and return it.
  self['__func_return'] = function(){
    var self = __self;
    var obj = {};
    obj['__func_expose'] = self['__func_expose'];
    obj['__func_add'] = self['__func_add'];
    obj['__func_return'] = self['__func_return'];
    for(var i=0;i<self.__func_list_fname.length;i++){
      obj[''+self.__func_list_fname[i]+''] = self.__func_list_func[i];
    };
    return obj;
  };
  // Return ourself so we can chain
  return self.__func_return();
}

Да. Я сделал мое домашнее задание. Я все еще что-то упускаю.

@ philgiese фреймворки хороши, но здесь мы хотим избежать зависимости и сделать ее легкой.
Кроме того, тут нет веселья , не так ли :-) Не поймите меня неправильно, я ничего не имею против использования прототипа.

1 Ответ

0 голосов
/ 04 ноября 2010

Помимо комментария @Pointy вам не хватает this, когда вы присваиваете __self для var self. Когда я читаю код, __self является переменной вашего foo объекта, поэтому вы должны ссылаться на него как this.__self при его использовании.

И, кстати, почему вы не используете какой-либо фреймворк для этого? Когда я правильно помню, фреймворк Prototype предлагает такую ​​функциональность.

EDIT : Просто посмотрел на тебя. Эта функция должна делать именно то, что вы хотите. AddMethods

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...