Это соглашение. Вы можете имитировать ОО-методы Java, например, закрытые члены, но это не рекомендуется. Вы можете подражать таким образом:
MyFunction = function(options){
var private = {};
//to reference MyFunction as a context
var that = this;
function privateFunctionThatCallPublicMethod(){
that.publicFunction("hello");
}
this.publicFunction = function(params){
alert(params + " " + private);
}
...
}
var instance = new MyFunction({oneOption:'fsdfsad'});
Это наилучший подход, который я нашел для эмуляции ОО Java-методов ...
Но есть проблема, очень неэффективная ...
Вместо этого вы должны использовать прототип, потому что в противном случае он будет создавать по одному объекту на функцию на экземпляр класса.
MyFunction = function(options){
this._private = {};
}
MyFunction.prototype._privateFunctionThatCallPublicMethod = function(){
this.publicFunction("hello");
}
MyFunction.prototype.publicFunction = function(params){
alert(params + " " + this._private);
}
Как вы думаете, частные члены (таким образом) конвенция .
Кроме того, есть еще одна вещь, которую вы должны знать ...
Когда вы передаете функцию объекта в качестве параметра другой функции, вы должны связать контекст функции ...
function bind(fnThis, fn) {
return function(){
return fn.apply(fnThis, arguments);
};
}
function makeSomething(callback){
callback("hello");
}
var instance = new MyFunction();
makeSomething(bind(instance, instance.publicFunction));
Это потому, что вы должны связать «this» как экземпляр в теле publicFunction, иначе вместо этого будет «window».