#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);