почему мы должны вызывать родительский конструктор в наследовании JavaScript - PullRequest
1 голос
/ 23 февраля 2012

Я экспериментирую с наследованием JavaScript.По сути, я следую этому учебнику.

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

Что я сделал, так это прокомментировал:

Person.call(this)

И наследование работает просто отлично.

В исходном коде используется строка

Person.call(this)

.Есть ли необходимость вызова родительского конструктора с дочерним контекстом?

Не могли бы вы также дать некоторые пояснения, я новичок в OO JavaScript.

Большое спасибо.

РЕДАКТИРОВАТЬ:

Мой код в скрипте выглядит следующим образом:

function Person(gender) {
    this.gender = gender;
    document.write('Person instantiated</br>');
}

Person.prototype.walk = function(){
    document.write("is walking</br>");
};

Person.prototype.sayHello = function(){
    document.write("Hello</br>");
};

Person.prototype.sayGender = function(){
    document.write(this.gender + "</br>");
};



function Student() {
    //Person.call(this);
    document.write('Student instantiated</br>');        
}
Student.prototype = new Person();

Student.prototype.constructor = Student;

Student.prototype.sayHello = function(){
    document.write("Student says Hello</br>");
}
Student.prototype.sayGoodBye = function(){
    document.write("Student says goodbye</br>");
}


var student1 = new Student();
student1.sayHello();
student1.walk();
student1.sayGoodBye();

document.write(student1 instanceof Person);
document.write("</br>");
document.write(student1 instanceof Student);

Ответы [ 3 ]

4 голосов
/ 03 апреля 2012

Да, вам это понадобится. В вашем примере все учащиеся имеют одинаковый пол, и будет создан только один экземпляр, независимо от количества экземпляров.

Лучше было бы:

function Student() {
    // gives this Student properties of one (new) Person:
    Person.call(this);
    document.write('Student instantiated</br>');        
} 
// does not create a Person, just makes Students have Person prototype features
Student.prototype = Object.create(Person.prototype);
1 голос
/ 03 апреля 2012

При выполнении предоставленного вами примера конструктор Person () вызывается только один раз во время первоначального выполнения скрипта, когда строка "Student.prototype = new Person ();" выполняется.

Если мы изменим ваш сценарий, чтобы создать второго ученика и отделить установку от экземпляра: bit: http://jsfiddle.net/anacW/

function Person(gender) {
    this.gender = gender;
    document.write('Person instantiated</br>');
}

Person.prototype.walk = function(){
    document.write("is walking</br>");
};

Person.prototype.sayHello = function(){
    document.write("Hello</br>");
};

Person.prototype.sayGender = function(){
    document.write(this.gender + "</br>");
};



function Student() {
    //Person.call(this);
    document.write('Student instantiated</br>');        
}
Student.prototype = new Person();

Student.prototype.constructor = Student;

Student.prototype.sayHello = function(){
    document.write("Student says Hello</br>");
}
Student.prototype.sayGoodBye = function(){
    document.write("Student says goodbye</br>");
}

document.write("*** Building student1 *** </br>");
var student1 = new Student();
student1.sayHello();
student1.walk();
student1.sayGoodBye();

document.write("*** Building student2 ***</br>");
var student2 = new Student();
student2.sayHello();
student2.walk();
student2.sayGoodBye();

document.write("*** InstanceOf Tests ***</br>");
document.write("student1 is Person?: " + (student1 instanceof Person));
document.write("</br>");
document.write("student1 is Student?: " + (student1 instanceof Student));
document.write("</br>");
document.write("student2 is Person?: " + (student2 instanceof Person));
document.write("</br>");
document.write("student2 is Student?: " + (student2 instanceof Student));

1007 *

Этот код дает:

Person instantiated
*** Building student1 *** 
Student instantiated
Student says Hello
is walking
Student says goodbye
*** Building student2 ***
Student instantiated
Student says Hello
is walking
Student says goodbye
*** InstanceOf Tests ***
student1 is Person?: true
student1 is Student?: true
student2 is Person?: true
student2 is Student?: true

Что показывает, что конструктор Person вызывается только один раз и никогда не вызывается при создании экземпляра Student. Это может быть желательно в вашем случае (я не знаю достаточно javascript, чтобы сказать вам, «правильная» ли это форма или нет).

0 голосов
/ 23 февраля 2012

Вот как я это делаю:

Foo = function() {}
Foo.prototype.sayHello = function() { console.log("hello"); }

Bar = function() {}
Bar.prototype = new Foo();
Bar.prototype.sayBye = function() { console.log("bye"); }

var oBar = new Bar();
oBar.sayHello(); // "hello"
oBar.sayBye(); // "bye"
...