0

Может кто-то сказать разницу между тем, как следующий набор кода выполняется в глубину.Создание нескольких экземпляров производного класса в javascript

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

Person.prototype.getName = function(){ 
    return this.name; 
} 

function Employee(designation){ 
    this. designation = designation; 
} 

Employee.prototype = Object.create(Person.prototype); 
Employee.prototype.constructor = Employee; 

Employee.prototype.getDesignation = function(){ 
    return this.designation; 
} 

var employee1= new Employee("Cons"); 
console.log(employee1.getName()+ " --- "+ employee1.designation); 
// Jagadish --- Cons 

var employee2= new Employee("Dev"); 
console.log(employee2.getName()+ " --- "+ employee2.designation); 
// Jagadish --- Dev 

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

Edit:

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

Метод 1:

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

Person.prototype.getName = function(){ 
    return this.name; 
} 

function Employee(name, designation){ 
    //Person.call(this, name); 
    this. designation = designation; 
} 

Employee.prototype = Object.create(Person.prototype); 
Employee.prototype.constructor = Employee; 

Employee.prototype.getDesignation = function(){ 
    return this.designation; 
} 

new Employee("Jagadish", "Cons"); 

Рисунок 1:

enter image description here

Способ 2:

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

Person.prototype.getName = function(){ 
    return this.name; 
} 

function Employee(name, designation){ 
    Person.call(this, name); 
    this. designation = designation; 
} 

Employee.prototype = Object.create(Person.prototype); 
Employee.prototype.constructor = Employee; 

Employee.prototype.getDesignation = function(){ 
    return this.designation; 
} 

new Employee("Jagadish", "Cons"); 

Рис 2: enter image description here

Мои сомнения в методе 1 мы не имеем имя свойства, потому что мы не называется Person конструктора. Но в методе 2 мы имеем свойство name, потому что мы вызывали конструктор Person. Но почему свойство name присваивается объекту Employee вместо Person.

+0

Вы должны передать имя и обозначение конструктору Employee, а затем передать только имя конструктору Person. – jfriend00

+1

Свойства прототипа являются общими, собственных свойств нет, поэтому используйте собственные свойства. – dandavis

ответ

1
function Person(name){ 
    this.name = name; // Update your Person class to accept a name 
} 

Person.prototype.getName = function(){ 
    return this.name; 
} 

function Employee(name, designation){ 
    this. designation = designation; 
    Person.call(this, name); // Update Employee to accept a name and call super 
} 

Employee.prototype = Object.create(Person.prototype); 
Employee.prototype.constructor = Employee; 

Employee.prototype.getDesignation = function(){ 
    return this.designation; 
} 

var employee1= new Employee("Sue", "Cons"); 
console.log(employee1.getName()+ " --- "+ employee1.designation); 
// Sue --- Cons 

var employee2= new Employee("Bob", "Dev"); 
console.log(employee2.getName()+ " --- "+ employee2.designation); 
// Bob --- Dev 
1

Во-первых, ваш человек объект HARD-Коды ваше имя, изменить конструктор, чтобы принимать имена:

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

Теперь сложная часть, в конструкторе Сотрудника, вам необходимо позвонить в «супер "class - класс, на который он наследует. это немного странно в JavaScript:

function Employee(name, designation){ 
    Person.call(this, name); // call Person constructor to set name 
    this.designation = designation; 
} 

Создание заново Employee теперь будет сделано так:

employee1 = new Employee('John', 'Manager') 
+0

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

+0

Это странная часть: функция '.call' активирует' Person' как функцию, а в качестве контекста она передает «Employee» (см. Функцию вызова). Затем, когда функция Person запускается, «this» относится к Employee, и поэтому его имя изменяется. – TastySpaceApple

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