Подтвердить что ты не робот

В JavaScript нужны "getter" и "setter"?

class Employee {

    constructor(name, age) {
        this._name = name;
        this.age = age;
    }

    doWork() {
        return `${this._name} is working`;
    }

    get name() {
        return this._name.toUpperCase();
    }

    set name(newName){
        if(newName){ 
            this._name = newName;
        }
    }
}

let man = new Employee('A', 10);
console.log(man.name, man.age);
man.name = 'B';
man.age = 20;
console.log(man.name, man.age);

Вот мой код. Я создал член getter и setter для _name. Я не создал getter и setter для age.

Но оба могут обновить эти два поля, например, man.name = 'B';man.age = 20;

Итак, я смущен, нужны ли getter и setter в JavaScript?

4b9b3361

Ответ 1

Да, getter или setter иногда могут быть очень полезны, но их нужно использовать только тогда, когда требуется их конкретная функциональность - в противном случае доступ к простому свойству без a getter или setter может быть просто отлично.

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

setter используется, когда вы хотите запускать некоторый код каждый раз, когда устанавливается свойство. В вашем случае это предотвращает установку фальшивого имени. Вы не можете реализовать ни одну из этих функций без getter/setter.

Прямой доступ к свойству - отличный способ сделать что-то, когда вам не нужна специальная логика getter или setter.

Также возможно, что getters и setters могут получить и установить какое-либо свойство, которое не является общедоступным (поэтому вообще недоступным при обычном доступе к свойству), либо потому, что оно хранится где-то по-другому (не как свойство этого объекта) или хранится в частном порядке или даже в том, что хранится в другом месте, например, на каком-либо аппаратном устройстве. в этих случаях getter и setter имитируют значение, находящееся в свойстве, когда его на самом деле нет. Таким образом, они упрощают интерфейс, позволяя сохранять или извлекать фактическое значение из любого места.

Ответ 2

нужно? Нет.

Существуют ли сценарии, которые лучше всего выражать как геттер/сеттер? Да. Рассмотрим "Вычисленные свойства":

//declare an object
rectangle = {
   x: 10,
   y: 20,
   get area() { return this.x * this.y }  //won't occupy storage
}

//usage
log('the area is', rectangle.area)        //=> 'the area is 200'.
                                          //   cleaner syntax (no parentheses)

Рассмотрите потребности дизайнеров API - скорее всего, они будут гиперчувствительны к тому, как пользователи воспринимают свой API. Каждый бит (или в этом случае, круглые скобки) рассчитывается для очистки интерфейса.

Ответ 3

Да, они очень необходимы. Просто не для каждой собственности.

Вот две причины иметь сеттеры:

1. Вам необходимо подтвердить входящее значение.

Допустим, у вас есть значение, которое должно быть целым числом от 0 до 100. Ваш установщик может проверить, что входящее значение имеет правильный тип и находится в правильном диапазоне:

class Range {
  set value(newVal) {
    let val = Number(newVal);
    
    if( newVal == null || typeof newVal === 'string' || !Number.isInteger(val) || val < 0 || val > 100 ) {
      const err = ''value' must be an integer from 0 to 100 and not ${newVal}';
      console.error(err);
      //throw new TypeError(err);
    }
    
    // save newVal
  }
}

const x = new Range();
x.value = 200;
x.value = 10;
x.value = "10";
x.value = new Number(22);

Ответ 4

Получатель и установщик r используются для доступа к ЧАСТНОЙ СОБСТВЕННОСТИ или изменения ее извне. GETTER - это функция, которая используется для чтения свойства. Если вы хотите установить значение частного свойства извне, мы определяем функцию SETTER. вот пример:

function Circle(radius){
this.radius=radius;
let originPoint={x:0,y:0};  //originPoint is a private property.
this.area=function(){console.log("area")};

Object.defineProperty(this,originPoint,{
    get:function(){
return originPoint;
};
set:function(value){
originPoint=value;}
}
}
const circle=new Circle(10);
circle.originPoint  //will call "get" function
circle.originPoint={x:2,y:3}

Ответ 5

Одна из главных причин, по которой была реализована функция получения и установки, заключалась в том, чтобы закрыть пробел в функции, который требовал от людей взломать интерпретатор/браузер js для достижения одной функции, которую могли бы выполнять браузеры:

element.innerHTML = "<div> some HTML string </dif>";

Теперь innerHTML может выглядеть как свойство, но на самом деле оно ведет себя больше как функция. Это на самом деле HTML-компилятор.

Вы можете увидеть это, попытавшись сделать:

element.innerHTML += "<table>";
element.innerHTML += "<tr><td>test</td></tr>"; // does not work

Это потому, что первый "вызов" innerHTML компилирует html в:

<table></table>

Вторая строка потерпит неудачу, потому что <tr> вне таблицы - недопустимый HTML.

С помощью getter и setter вы можете, наконец, реализовать такую функцию в чистом javascript - заставить доступ к свойству вызывать вызов функции.

Конечно, innerHTML - это всего лишь один пример получения и установки и очень плохой пример API. Это зависит от вашего творчества, что вы можете сделать с геттерами и сеттерами.

Теперь, по моему личному мнению (и это только мое мнение, поэтому примите это во что бы то ни стало): я думаю, что innerHTML предоставляет хороший пример того, почему геттер и сеттеры обычно не должны использоваться. Путаница с <table> является хорошим примером нарушения ожиданий пользователя. Если бы innerHTML был реализован как element.appendHTML() его поведение было бы менее удивительным. Как программист, я был бы очень удивлен, если доступ к свойствам делает то, чего я не ожидаю.

Тем не менее, я рад, что методы получения и установки существуют, чтобы сделать библиотеку функции языка самостоятельно реализуемо без необходимости прибегать к взлому в C/C++.

Ответ 6

Использование методов getter и setter зависит от вашего свойства в классе, если вы хотите сделать свойство только для чтения только его истинным для использования метода getter следующим образом:

function Person(name, age){
  var _name = name;
  this.age = age;
  
  this.getName = function(){
    return _name;
  }
}

var teacher = new Person('Sara', 24);

//now you can just get the name of teacher 
alert(teacher.getName());
  

Ответ 7

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

Когда код возрастает, вы не сможете отлаживать, где ваш код не работает. Если вы следуете структуре, вы можете легко выполнить dubug. Поскольку каждый объект будет в отдельном файле, логика будет отдельной.

Но JavaScript - это объектно-ориентированный язык программирования. Причина, по которой мы используем классы вместо объектов, то же самое для геттеров и сеттеров. Не нравится, где вы можете использовать то, где вам не нужно. установить и получить все свойства через сеттеры и геттеры.

Через некоторое время вы можете столкнуться с добавлением некоторого условия при настройке свойства, например, если возраст лиц превышает 100, вы не должны устанавливать его в свойстве. В этот момент вам нужно изменить свой базовый класс, а также в ваших дочерних классах. Это будет самая сложная часть нашей жизни (рефакторинг кода). Поэтому избегайте подобных проблем и делайте свои переменные безопасными, с моей точки зрения, мы должны использовать геттеры и сеттеры.