2010-10-26 3 views
1

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

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-файла.

+0

Просто для уточнения, наиболее важной частью является получение доступа к закрытым переменным из приложенных функций. Использование «прототипа» не требуется, если ** my_class.my_funcs.afunction(); ** добавляется к объекту вне основного класса и может получить доступ к private_var. –

+0

У вас есть объект, а не класс.Точнее, это синглтон. Если вы использовали вызовы конструктора для создания новых объектов на основе вашей функции, мы могли бы назвать это «псевдоклассом». Но здесь это не так. –

+0

Я не уверен, что правильно вас понимаю. Вы говорите, что просто увеличение объекта 'my_class' не является для вас вариантом? (Например: 'my_class.my_funcs.afunction = function() {...};') –

ответ

0

Попробуйте объявить свой «класс», как это:

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 или ничего не будет работать должным образом.

// Correct 
var instance = new MyClass(); 
instance.publicFn(); //-> 'foo' 
// Incorrect 
MyClass.publicFn(); //-> TypeError 
+0

Есть ли любой метод, который позволит MyClass.prototype.aFunction() для доступа к privateNum, например MyClass.publicObject.fn(), может? –

+0

@Aaron: Нет. Вы можете получить доступ только к частным переменным, если они находятся в одной области. – xj9

0

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

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

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

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

Я обновил вопрос, но доступ к частным переменным - это та часть, на которую я застрял. Я пробовал 3 или 4 различных метода, которые я мог бы придумать, и не могу надежно их использовать. –

+0

Ах. Затем проверьте это: http://stackoverflow.com/questions/436120/javascript-accessing-private-member-variables-from-prototype-defined-functions – Hollister

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