Как изменить значение переменной в прототипе Javascript

#javascript #function-prototypes

#javascript #функция-прототипы

Вопрос:

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

 function Student() {
  this.name = "John";
  this.type = "Regular";
}

Student.prototype.changeType = function(givenType) {
  this.type = givenType;
}

Student.prototype.changeType('Part-Time');

var William = new Student();

console.log(William.type); //Regular  

Ожидаемое значение консоли Part-Time

Ответ №1:

Редактировать: Если вы хотите задать тип для всех текущих и будущих экземпляров, вы можете попробовать сохранить все экземпляры. Вам нужно будет обновлять всех новых учеников по мере их добавления. JavaScript не знает, как получить все объекты, текущие и будущие, только по имени класса.

 function Student() {
  this.name = "John";
  this.type = "Regular";
  Student.instances.push(this); // Add
}
Student.prototype.changeType = function(givenType) {
  this.type = givenType;
}

Student.instances = []; // Keep track
Student.changeAllTypes = function(type) {
  Student.instances.forEach(function(instance) {
    instance.changeType(type);
  });
};

var William = new Student();

Student.changeAllTypes('Part-Time');

console.log(William.type); // Part-Time  

Правильный способ сделать это — просто передать соответствующие параметры во время создания экземпляра объекта.

 function Student(name, type) {
  this.name = name;
  this.type = type;
}

var william = new Student('William', 'Part-Time');

console.log(william.type); // Part-Time  


Прототип — это не то же самое, что экземпляр.

 function Student() {
  this.name = "John";
  this.type = "Regular";
}

Student.prototype.changeType = function(givenType) {
  this.type = givenType;
}

Student.prototype.changeType('Part-Time');

var William = new Student();

console.log(Student.prototype.type); // Part-Time  

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

 function Student () {
    this.name = "John";
    this.type = "Regular";
}

Student.prototype.changeType = function (givenType) {
   this.type = givenType;
}

var William = new Student();

William.changeType('Part-Time');

console.log(William.type); // Part-Time  

Или вы могли бы создать собственный класс ES6, что упрощает задачу.

 class Student {
  constructor(name = 'John', type = 'Regular') {
    this.name = name;
    this.type = type;
  }
  setType(type) {
    this.type = type;
  }
  getType() {
    return this.type;
  }
}

var william = new Student();

william.setType('Part-Time');

console.log(william.getType()); // Part-Time  

Комментарии:

1. Спасибо за быстрый ответ, на самом деле я пытаюсь переопределить существующий метод в объекте или реквизите. Не могли бы вы посоветовать, как этого добиться?

2. @rkaartikeyan итак, отражение?

Ответ №2:

JS проверяет следующий уровень цепочки прототипов только в том случае, если значение для свойства не было установлено для самого объекта.

Вы вызываете changeType прототип, а не сам объект.

Конструктор устанавливает свойство для самого объекта.

Вызов William.changeType("Part-Time") будет иметь желаемый эффект.

Комментарии:

1. Спасибо за быстрый ответ, на самом деле я пытаюсь переопределить существующий метод в объекте или реквизите. Не могли бы вы посоветовать, как этого добиться?

2. Если вы хотите переопределить метод, вам нужно назначить новую функцию свойству ChangeType

3. Я пробовал ниже, но все еще не работает. « функция Student () { this.name = «Джон»; this.type = «Обычный»; this.ChangeType = функция () { console.log(‘Неполный рабочий день’); } } Student.prototype.ChangeType= функция (givenType) { this.type = givenType; } var William = new Student(); William.ChangeType(‘Неполный рабочий день’); console.log(William.type); «

4. Чего вы ожидаете? Вы переопределили метод ChangeType, поэтому он вызвал консоль. регистрируйте вместо изменения типа!

5. @Quentine, точно. Я хочу изменить существующую функцию.

Ответ №3:

Я думаю, вам нужна структура, в которой есть метод, который ссылается на экземпляр (this) constructor . prototype Тогда следующий new экземпляр будет иметь свойство, вызываемое ранее вызванным методом экземпляра.

 function Student(name = null, type = null){
  this.changeName = name=>{
    this.constructor.prototype.name = name;
    return this;
  }
  this.changeType = type=>{
    this.constructor.prototype.type = type;
    return this;
  }
  if(name !== null)this.changeName(name);
  if(type !== null)this.changeType(type);
}
const john = new Student('John', 'Part-Time');
console.log(john.name ' -> ' john.type);
const bob = new Student('Bob');
console.log(bob.name ' -> ' bob.type);
const joe = new Student('Joe', 'Full-Time');
console.log(joe.name ' -> ' joe.type);
const dan = new Student('Dan');
console.log(dan.name ' -> ' dan.type);