Это очень неортодоксально, но ничто не мешает вам вкладывать функции конструктора в JavaScript.
Из вашего примера вы можете получить доступ к функции B из экземпляра A:
var someA = new A();
var someB = new someA.B();
Чтобы ответить на другой вопрос:
this.B = function() {
this.ab = 0;
this.c = function() {
this.ab++;
}
}
То, к чему относится this
внутри B, зависит от того, как B
вызывается . Если вы вызовете B
в качестве конструктора с ключевым словом new
, this
будет новым объектом, унаследованным от прототипа B.
Если вы вызываете B без new
, он будет рассматриваться как метод, а this
будет экземпляром A, для которого был вызван метод.
И так далее с C. Если C вызывается с new
, this
внутри C будет новым объектом, унаследованным от прототипа C. Или C может быть методом B, который имеет гораздо больше смысла. Это то, что вы хотите:
function A() {
this.a;
this.B = function() {
this.ab = 0;
this.c = function() {
this.ab++;
}
}
}
var someA = new A();
var someB = new someA.B();
console.log(someB.ab); //0
someB.c();
console.log(someB.ab); //1
DEMO
Наконец, обратите внимание, что, хотя такие вложенные конструкторы не слишком распространены, ничто не мешает вам добавить к прототипу B
, как вы это делаете с любым другим конструктором
function A() {
this.a;
this.B = function() {
this.ab = 0;
this.c = function() {
this.ab++;
}
}
this.B.prototype.foo = function() { alert("Bar " + this.ab) };
}
var someA = new A();
var someB = new someA.B();
console.log(someB.ab);
someB.c();
console.log(someB.ab);
someB.foo(); //Bar 1
Обновленная демоверсия