2012-04-02 1 views
0

У меня есть код, который выглядит следующим образом:Прототип для частных суб-методов

var baseClass = function() { 
// CODE 
    var subClass = function() { 
     // MORE CODE 
    } 
} 

Добавление методов BaseClass прекрасно, я просто использовать

baseClass.prototype.newMethod = function() { 
    // NEW CODE 
} 

Мой вопрос, как я должен добавить методы подкласс? Единственный способ просто сделать его общедоступным?

######## EDIT ##############

ОК, так что я переставить код так подклассу находится вне BaseClass. Я передаю baseClass, поэтому subClass все равно может получить доступ к свойствам экземпляра baseClass.

var baseClass = function() { 
    var base = this; 
    this.property_a = 1; 
    this.property_b = 5; 

    var sub = new subClass(base); 
    // CODE 
} 

var subClass = function(parent) { 
    var sub = this; 
    this.property_c = 1; 
    this.method_a = function() { 
     return sub.property_c + parent.property_a; 
    } 
    // MORE CODE 
} 

это хорошо и работает, но теперь у меня есть новая проблема, когда я добавляю метод, использующий прототип:

subClass.prototype.method_b = function(){ 
    return sub.property_c + parent.property_b; 
} 

я получаю ошибку о том, родитель не определен.

В принципе у меня есть довольно простое веб-приложение, которое имеет две стороны, сторону просмотра и сторону редактирования. Я создаю базовый класс, который включает все необходимое для просмотра, и я хочу добавить методы, необходимые для редактирования в другом файле, чтобы они загружались только тогда, когда пользователь находится на странице редактирования.

+0

Просто выполните subClass.prototype.newMethod, изнутри baseClass, no? Я думаю, что это ответ gilly3. Лично я не понимаю, почему вам нужно добавлять методы после определения «класса», почему вы должны сделать JavaScript настолько сложным? Это похоже на процедурное создание класса, а не только его определение. –

ответ

1

Почему вы объявляете этот подкласс в базовом классе? Не имеет смысла для меня.

Вы можете добавить прототип подкласса, если он находится в вашем объеме. В вашем коде это будет

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() { ... } 
})() 

EDIT, чтобы ответить на вопрос: расширенный

Ах, Подкласс не наследует от BaseClass! Мы ожидали, что, в противном случае, возможно, что он будет внутри конструктора.Затем тот же прототип мог быть добавлен к каждому из различного Подкласса конструкторов:

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), вы можете дать базовый экземпляр суб принадлежит как аргумент конструктору - как и вы. Конечно, суб (как внутренние, так и внешние методы) могут обращаться только к общедоступным свойствам этого базового экземпляра.

Ошибка, которую вы сделали в вашем перестроенном коде, заключается в том, что ваши прототипы («внешние») методы пытались получить доступ к частной переменной 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; 
} 
+0

Но где вам нужен ваш субкласс для создания нового экземпляра baseClass? – Bergi

+0

А? Не удаляйте свои комментарии, пока я отвечаю :-) – Bergi

+0

haha ​​sorry Я отредактировал исходное сообщение. – synaptomy

0

Если вы действительно хотите, чтобы подклассы частными, вы можете скрыть определения в затворе:

var BaseClass = (function() { 
    function BaseClass() { ... }; 
    function SubClass() { ... }; 
    BaseClass.prototype.foo = function() { ... }; 
    SubClass.prototype.foo = function() { ... }; 
    return BaseClass; 
})(); 

Я лично нашел этот вид закрытия усилена защиты, чтобы быть больше проблем, чем это стоит (например, , делает отладку более сложной) ... Но если вы захотите это сделать, вот как бы вы это сделали.

1

Вы должны определить методы в том же контексте, как вы определяете subClass:

var baseClass = function() { 
    // CODE 
    var subClass = function() { 
     // MORE CODE 
    } 
    subClass.prototype.newMethod = function() { ... } 
} 

Если это не представляется возможным, то вам нужно будет выставить subClass в соответствующем контексте или обеспечить механизм от baseClass к простираются subClass.