Javascript наследующий вопрос - PullRequest
2 голосов
/ 01 марта 2011

Я пытаюсь разобраться с наследованием JS, используя стиль «псевдоклассического наследования».Я сделал много поисков Google и прочитал классические статьи.Я знаком со структурой классов Java и пытаюсь понять стиль прототипа JS.Я ищу ванильный JS, так как сначала хочу понять основы.

У меня есть простой родительский / дочерний тестовый класс, и мне нужна помощь с правилами области видимости.

1.)Когда я определяю методы в классе против вне класса?

2.) Как получить доступ к закрытым переменным и закрытым функциям при создании методов с использованием стиля прототипа?

function superClass(name){
  this.name = name;
  var privateValue = "I'm Private";
  this.outputPrivate2 = function(){
    alert(privateValue); //works fine
  }      
}

superClass.prototype.outputPrivate = function(){
alert(this.privateValue); //outputs undefined..   
    alert(superClass.prototype.privateValue) //also undefined  
}

3.) Как дочерние объекты могут вызывать частные функции или обращаться к закрытым переменным родительского объекта?

4.) Когда дочерний объект должен вручную вызывать родительский конструктор?

subClass2.prototype = new superClass();                // Define sub-class
subClass2.prototype.constructor = subClass2;

function subClass2(name) {
this.name = name;
this.Bye = function() {
return "Bye from subClass - " + this.name;
}   
this.testm = function(){
superClass.prototype.SomeParentMethod.call(this, "arg1", "arg2");
}

}

var parent = new superClass("parent");
var child = new subClass("child1");
parent.outputPrivate(); //undefined
parent.outputPrivate2(); //I'm private
child.outputPrivate(); //undefined
child.outputPrivate2(); //I'm private

У меня было три объекта, в которых дублировалось 80% кода, поэтому я создал родительский объект и три дочерних объекта.Дочерние объекты имеют методы, которые используют и управляют частными данными от родителя.Единственный способ заставить это работать - сделать все переменные общедоступными, что мне не нравится.Опять же, я знаком с Java, поэтому я слишком стараюсь, чтобы JS работал как Java.

1 Ответ

3 голосов
/ 01 марта 2011

Вы рассматриваете некоторые интересные моменты объектно-ориентированного JavaScript здесь.

1) Когда вы определяете метод в классе, новая функция будет создаваться каждый раз, когда вы вызываете конструктор.Это может привести к проблемам с производительностью, если вы используете много объектов.Когда вы присоединяете метод к объекту-прототипу, функция создается только один раз.

2) Но преимущество определения функций внутри конструктора состоит в том, что вы можете использовать "приватные" методы / свойства.В Javascript нет ничего похожего на приватную переменную.Вместо этого вы создаете замыкание, которое содержит некоторые переменные.

Если вам все равно нужно использовать эти переменные вне конструктора, вам нужно сделать их открытыми.

3) Та же проблема.

4) Хотя ваш вопрос не полностьюясно, я бы сделал что-то вроде этого:

function parent(){
    this.a = 1;
}

function child(){
    parent.call(this);
    this.b = 2;
}

obj = new child();
// now obj.a == 1, obj.b == 2
...