После хороших принципалов дизайна OO и шаблонов разработки имеет большое значение для создания Вашего кода, легкого поддержать и понять. Но одной из лучших вещей, которые я обнаружил недавно, являются сигналы, и слоты иначе публикуют/подписывают. Взгляните на http://markdotmeyer.blogspot.com/2008/09/jquery-publish-subscribe.html для простой реализации jQuery.
идея хорошо используется на других языках для разработки GUI. Когда что-то значительное происходит где-нибудь в Вашем коде, Вы публикуете глобальное синтетическое событие, на которое могут подписаться другие методы в других объектах. Это дает превосходное разделение объектов.
я думаю Dojo (и Прототип?) имеют созданный в версии этой техники.
видят также , Что такое сигналы и слоты?
сделайте что-нибудь вроде:
var myObject = function() {
var p = 'private var';
function private_method1() {
public.public_method1()
}
var public = {
public_method1: function() {
alert('do stuff')
},
public_method2: function() {
private_method1()
}
};
return public;
} ();
//...
myObject.public_method2()
public_method1
не является общедоступным методом. Это метод анонимного объекта, который полностью создается внутри оператора return вашей функции-конструктора.
Если вы хотите его вызвать, почему бы не структурировать объект следующим образом:
var myObject = function() {
var p...
function private_method() {
another_object.public_method1()
}
var another_object = {
public_method1: function() {
....
}
}
return another_object;
}() ;
Не знаю прямого ответа, но следующее должно работать.
var myObject = function()
{
var p = 'private var';
function private_method1() {
_public_method1()
}
var _public_method1 = function() {
// do stuff here
}
return {
public_method1: _public_method1
};
} ();
Почему бы не сделать это как нечто, что вы можете создать?
function Whatever()
{
var p = 'private var';
var self = this;
function private_method1()
{
// I can read the public method
self.public_method1();
}
this.public_method1 = function()
{
// And both test() I can read the private members
alert( p );
}
this.test = function()
{
private_method1();
}
}
var myObject = new Whatever();
myObject.test();