2016-10-15 3 views
1

Я новичок в программировании javascript. Недавно я столкнулся с проблемой, запутывающей меня в моем путешествии по javascript. Я хочу создать конструктор Teacher(), который наследует всех членов конструктора Person().Как правильно создать свойство прототипа одного конструктора наследовать свойство прототипа своего оригинала?

Во-первых, я создаю Person() следующим образом

function Person(name) { 
     this.name = name; 
    }; 

    Person.prototype.greeting = function() { 
     alert('Hi! I\'m ' + this.name + '.'); 
    }; 

Во-вторых я создаю Учителя() от лица().

function Teacher(name){ 
     Person.call(this,name); 
    }; 

Вот проблема:

Когда я попытался установить Учителя() 's прототип, это меня смутило, что следующие две практики кажутся одинаковыми. Думаю, они должны иметь определенную разницу. я писал следующее первое:

Teacher.prototype = Object.create(Person.prototype); 

После того как я писал выше, я думаю, Teacher.prototype будет равна Person.prototype, что оказалось неверным:

Teacher.prototype === Person.prototype;//=>false 

Однако, teacherA, экземпляр Учителя(), наследует метод приветствия от лица() успешно:

var teacherA = new Teacher(); 
    teacherA.name = 'Kyle'; 
    teacherA.greeting();//=>Hi!I'm Kyle. 

Затем я попытался изменить мой код следующим образом, который сделал Учитель() 's прототипа свойства фас аль к Person() 's прототип объекта:

Teacher.prototype = Person.prototype; 
    Teacher.prototype === Person.prototype;//=>true 

Конечно, teacherB, другой экземпляр Учителя(), наследует метод приветствие от лица(), а также:

var teacherB = new Teacher(); 
    teacherB.name = 'Jane'; 
    teacherB.greeting();//=>Hi!I'm Jane. 

Кто-нибудь может сказать мне, почему эти две практики наследовали успешно, но в одной из двух ситуаций Teacher.prototype не был равен Person.prototype, что противоположно в другой ситуации? Благодаря!

ответ

0

После того как я писал выше, я думаю, что Teacher.prototype будет равен Person.prototype, которые оказались неверными

Да, потому что при использовании Object.create создает новый объект с прототипом является Person.prototype. Это своего рода то, что происходит:

var mediator = {}; 
Object.setPrototypeOf(mediator, Person.prototype); 
Teacher.prototype = mediator 

Таким образом, в результате чего цепочка прототипов, как это:

Teacher.prototype -> middle.__proto__ -> Person.prototype 

Однако teacherA экземпляр Учителя(), наследует метод приветствия от лица () успешно:

Да, потому что, как я показал выше Person.prototype все еще может быть достигнуто с Teacher.prototype.

Затем я попытался изменить мой код следующим образом, который сделал Учитель() «s прототипа свойства равного Person()» ы прототипа свойство:

Это не должно быть сделано, потому что вы может захотеть добавить методы к прототипу Учителя, который не должен быть доступен человеку. Но при этом, если вы добавите какой-либо метод прототипу Учителя, он будет доступен из экземпляров Person. Итак, после этого:

Teacher.prototype = Person.prototype; 

var teacher = new Teacher(); 
var person = new Person(); 

// let's add method to child Person 
Person.prototype.childMethod = function() {}; 

// the parent can still access it 
person.childMethod(); // works OK 
+0

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

+0

Можете упомянуть, что когда вы написали: –

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