Я использовал следующие шаги для создания класса с частной и публичной областью действия в JavaScript:
- Создать нормальную цепочку прототипов только с открытыми членами
- Либо помечайте открытые методы как открытые, так и закрытые, как частные, используя логический набор самого метода. (vis.
function foo() {}; foo._private = true;
)
- Создание цепочки внутри "класса интерфейса"
- Перебирать экземпляр цепочки, создавая ссылки на его открытые члены в классе интерфейса
- Перепривязать эти ссылки к экземпляру цепочки
Вот код:
function BaseClass() {
this.A = function A() {
this.B();
}
this.B = function B() {}
this.C = function C() {
console.log('I am C');
}
this.C._private = true;
}
function Subclass() {
this.D = function D() {
this.C();
}
this.B = function B() {
console.log('I am B');
}
}
Subclass.prototype = new BaseClass();
function Interface() {
var classScope = new Subclass();
for ( var property in classScope ) {
if ( !classScope[property]._private ) {
this[property] = classScope[property].bind(classScope);
}
}
}
var classInstance = new Interface();
console.log(classInstance);
classInstance.A();
classInstance.B();
classInstance.D();
Чтобы увидеть вывод, проверьте этот код пера .
Чтобы увидеть, как код немного подправлен, чтобы прояснить назначение каждого выражения, проверьте этот код pen .
Обратите внимание, что function C() {}
полностью инкапсулирован function Interface() {}
, но (new Interface()).D()
все еще имеет к нему доступ.
Также обратите внимание, что (new Interface()).A()
вызывает Subclass#B()
.