Можно ли добавить функции к классу JS, которые имеют доступ к закрытым переменным класса? - PullRequest
1 голос
/ 26 октября 2010

У меня есть существующий класс, который мне нужно преобразовать, чтобы я мог добавлять такие функции, как my_class.prototype.my_funcs.afucntion = function () {alert (private_var);} после определения основного объекта. Какой самый лучший / самый простой метод для преобразования существующего класса для использования этого метода? В настоящее время у меня есть объект JavaScript, сконструированный так:

var my_class = function (){

 var private_var = '';
 var private_int = 0
 var private_var2 = '';
 [...]

 var private_func1 = function(id) {
  return document.getElementById(id);
 };

 var private_func2 = function(id) {
  alert(id);
 };

 return{
  public_func1: function(){

  },

  my_funcs: {
   do_this: function{

   },
   do_that: function(){

   }
  }
 }
}();

К сожалению, в настоящее время мне нужно динамически добавлять функции и методы к этому объекту с помощью PHP на основе выбранных пользователем настроек, не может быть добавлено ни одной функции или 50. Это делает добавление функций очень сложным, потому что добавить my_class .my_funcs.afunction (); функция , мне нужно добавить вызов PHP внутри файла JS , чтобы он мог обращаться к закрытым переменным , и он просто запутывает все.

Я хочу иметь возможность использовать метод-прототип, чтобы я мог очистить все вызовы PHP внутри основного файла JS.

Ответы [ 3 ]

0 голосов
/ 27 октября 2010

Хорошо, так как вы создаете класс, отличается от того, что я обычно делаю, но я смог заставить работать ниже:

var my_class = function() {
    var fn = function() {
        this.do_this = function() { alert("do this"); }
        this.do_that = function() { alert("do that"); }
    }
    return {
        public_func1: function() { alert("public func1"); },
        fn: fn,
        my_funcs: new fn()
    }
}
var instance    = new my_class();
instance.fn.prototype.do_something_else = function() { 
    alert("doing something else"); 
}
instance.my_funcs.do_something_else();

Относительно того, что происходит [Отредактировано]:

  • Я изменил ваш объект my_funcs на закрытый метод 'fn'
  • Я передал ссылку на него на похожее имя 'fn' в экземпляре возвращаемого объекта, чтобы вы могли создать его прототип.
  • Я сделал my_funcs экземпляром приватного члена fn, чтобы он мог выполнять все методы fn

Надеюсь, это поможет, - Кевин

0 голосов
/ 27 октября 2010

Может быть, мне не хватает того, что вы пытаетесь сделать, но вы не можете просто назначить прототип экземпляру после его создания? Итак, сначала создайте объект-прототип:

proto = function(){
    var proto_func = function() {
        return 'new proto func';
    };
    return {proto_func: proto_func};
}();

Тогда используйте это:

instance = new my_class();
instance.prototype = proto;
alert(instance.prototype.proto_func());
0 голосов
/ 27 октября 2010

Попробуйте объявить свой «Класс» следующим образом:

var MyClass = function () {
    // Private variables and functions
    var privateVar = '',
        privateNum = 0,
        privateVar2 = '',
        privateFn = function (arg) {
            return arg + privateNum;
        };
    // Public variables and functions
    this.publicVar = '';
    this.publicNum = 0;
    this.publicVar2 = '';
    this.publicFn = function () {
        return 'foo';
    };
    this.publicObject = {
        'property': 'value',
        'fn': function () {
            return 'bar';
        }
    };
};

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

MyClass.prototype.aFunction = function (arg1, arg2) {
    return arg1 + arg2 + this.publicNum;
    // Has access to public members of the current instance
};

Полезно?

Редактировать: Убедитесь, что вы создали экземпляр MyClass, иначе ничего не будет работать должным образом.

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