Почему вы объявляете этот подкласс в базовом классе? Не имеет смысла для меня.
Вы можете добавить к прототипу подкласса, где бы он ни находился. В вашем коде это будет
var baseClass = function() {
// CODE
var subClass = function() {
// MORE CODE
}
subClass.prototype = {
...
}
}
Но я бы предложил исключить его из конструктора базового класса. Если вы хотите, чтобы это было конфиденциально по какой-то причине, добавьте закрытие:
(function(){
baseClass = function() { // public
// CODE
}
baseClass.prototype = {...};
var subClass = function() { // private
// MORE CODE
}
subClass.prototype = Object.create(baseClass.prototype);
subClass.prototype.newMethod = function () { ... }
})()
РЕДАКТИРОВАТЬ, чтобы ответить на расширенный вопрос:
Ах, подкласс не наследуется от базового класса! Мы ожидали, что в противном случае это может быть нормально, чтобы это было внутри конструктора. Затем один и тот же прототип мог быть добавлен к каждому из различных конструкторов подкласса:
var subproto = {
method_b: = function(){
// manipulate "this"
},
...
};
function baseClass() {
// some code
function sub() {
// is a constructor for subs which belong to this specif base intance
...
}
sub.prototype = subproto; // the sub constructors of each base instance
// have the same prototype
var x = new sub(),
y = new sub(); // example usage of the sub constructor
}
baseClass.prototype = {...}
Иначе, если вам нужен один общий вспомогательный конструктор (вне функции baseClass), вы можете указать базовому экземпляру, к которому принадлежит sub, в качестве аргумента для конструктора - как вы и сделали. Конечно, sub (как внутренние, так и внешние методы) могут получить доступ только к открытым свойствам этого базового экземпляра.
Ошибка, которую вы допустили в переставленном коде, заключается в том, что ваши прототипные («внешние») методы пытались получить доступ к закрытой переменной parent
из вспомогательного конструктора. Как вы говорите, «ошибка в том, что родитель не определен».
var subClass = function(parent) {
var sub = this;
this.parent = parent; // make it public
this.property_c = 1;
this.method_a = function() {
return sub.property_c + parent.property_a;
}
// MORE CODE
}
subClass.prototype.method_b = function(){
// prototype functions can only access public properties
// i.e. privileged methods, public attributes and other prototype properties
return this.property_c + this.parent.property_b;
}