2013-09-05 3 views
1

Я прочитал большинство ссылок на наследование Javascript, но, боюсь, я все еще царапаю себе голову о том, как это сделать.Простой «статический» в базовом классе Javascript

Я пытаюсь собрать несколько классов , в общем смысле, которые будут иметь подобное поведение, и мысль с использованием прототипов может быть способом достижения этого. Поэтому я создаю базовый класс следующим образом:

function my_base_class() 
{ 
    var a_common_object = undefined; // The true value of this can't be set until runtime. 

    // some other stuff ... 
}; 

В идеале я хотел бы a_common_object быть частным или по крайней мере защищены, но просто получить его работы будет хорошим первым шагом. Затем мне нужно создать несколько производных классов которых это может быть один:

function my_derived_class() 
{ 
    this.do_something_to_common_object = function() 
    { 
     // Here I need to reference my_base_class.a_common_object but 
     // at this point there's no relationship between the two classes 
    }; 
}; 

я теперь установить прототип my_derived_class при создании экземпляра:

my_derived_class.prototype = new my_base_class(); 
var my_derived_class_inst = new my_derived_class(); 

Так что на данный момент я нахожусь надеясь, что у меня есть объект - my_derived_class_inst, который имеет черты my_base_class, включая статический объект a_common_object, к которому я могу получить доступ.

У меня есть два вопроса:

  1. Как обратиться к a_common_object в my_derived_class, когда не там нет отношения, установленные между этими двумя классами?
  2. Как я могу изменить a_common_object на его истинное значение, так что все производные классы легко получают новое значение.

Просьба не просто ссылаться на стандартные ссылки на веб-сайты по наследованию, поскольку я прочитал их большинство, и я по-прежнему не мудрее. Мне кажется, что ответ должен быть очень простым, но пока это ускользает от меня. Большое спасибо.

ответ

2

do_something_to_common_object() действительно не имеет возможности достичь a_common_object напрямую.

a_common_object не является членом экземпляра, созданного для prototype. Это локальная переменная, заключенная внутри конструктора. Таким образом, только function, который также определен в конструкторе можно добраться до него (ссылка: closures):

function my_base_class() 
{ 
    var a_common_object = undefined; 

    Object.defineProperty(this, 'a_common_object', { 
     get: function() { 
      return a_common_object; 
     } 
    }); 

    // ... 
} 
function my_derived_class() 
{ 
    this.do_something_to_common_object = function() 
    { 
     console.log(this.a_common_object); // uses getter to retrieve the value 
    }; 
}; 

Это будет по-прежнему доступны для общественности, но ваши возможности ограничены, как JavaScript еще не установлены поддерживать или иметь эквивалент модификатора доступа.

Хотя, с Object.defineProperty(), он по крайней мере будет доступен только для чтения и не перечислит по умолчанию (не будет отображаться в цикле for..in).

По крайней мере, до #2, где вам также необходимо установить сеттер. Хотя, это будет шанс проверить ценность хранения.

Object.defineProperty(this, 'a_common_object', { 
    // .... 

    set: function (value) { 
     if (/* validator */) { 
      a_common_object = value; 
     } 
    } 
}); 
+0

Работает с удовольствием! Большое спасибо! –

Смежные вопросы