Доброго времени суток!
Нужно создать объект с приватными и публичными свойствами и методами так, чтобы все части объекта могли работать друг с другом, в т.ч. по таймаутам и интервалам без ограничений видимости, контекста и т.д., ну а внешние объекты - согласно уровню доступа. Наследников не будет.
Делаю так:
function obj() {
privateField1;
var privateField2;
this.publicField;
function privateMethod(){
if( privateField1 == ... ) { //do something }
if( privateField2 == ... ) { //do something else }
if( this.publicField == ... ) { //do something else else :) }
},
this.publicMethod1 = function() {
var self = this;
setTimeout( function(){ self.privateMethod(); }, interval );
},
this.publicMethod2 = function() {
var self = this;
setTimeout( function(){ privateMethod.call( self ); }, interval );
}
}
document.MyObj = new obj();
document.MyObj.publicMethod1();
document.MyObj.publicMethod2();
И получается так, что внутри приватного метода несмотря на передачу контекста значения полей не соответствуют тому, что лежит в экземпляре объекта. При разных манипуляциях способ вызова может начать ругать и на "privateMethod() is not a function".
privateField1 вообще становится частью объекта window и его модификация в разных контекстах приводит к тому, что одновременно существуют window.privateField1, MyObj.proivateField1 и this.privateField1 с разными значениями в зависимости от контекста.
Если все поля и методы сделать публичными, то первый метод работает нормально, но теряется управление уровнем доступа для внешних объектов.
Подскажите, в каком месте у меня затуп и ЧЯДНТ?