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

У Javascript есть/заданные ключевые слова, такие как С#?

Я работаю с XULRunner и набрал следующий образец в примере кода:

var StrangeSample = {

backingStore : "",

get foo() { return this.backingStore + " "; },

set foo(val) { this.backingStore = val; },

func: function(someParam) { return this.foo + someParam; }
};

StrangeSample.foo = "rabbit";
alert(StrangeSample.func("bear"));

Это приводит к предупреждению "медведя кролика".

Я никогда не видел этот шаблон get/set, используемый в Javascript раньше. Он работает, но я не могу найти никакой документации/ссылки для него. Это что-то особенное для XUL, недавняя языковая функция или просто что-то, что я пропустил? Я озадачен тем, что несколько месяцев назад я специально искал что-то вроде этого и ничего не нашел.

Для справки удаление "get" или "set" приводит к ошибке синтаксиса. Переименование их во что-либо еще является синтаксической ошибкой. Они действительно являются ключевыми словами.

Может ли кто-нибудь пролить свет на это для меня или указать мне на ссылку?

4b9b3361

Ответ 1

Как было предложено Martinho, вот некоторые ссылки, объясняющие геттер/сеттеры в JS 1.5:

http://ejohn.org/blog/javascript-getters-and-setters/

http://ajaxian.com/archives/getters-and-setters-in-javascript

Помните, что в IE они, похоже, не поддерживаются, а некоторые разработчики (законные) обеспокоены идеей присвоения переменной, имеющей побочные эффекты.

get/set - это не зарезервированные ключевые слова, как указывает Дэниел. У меня не возникло проблем с созданием функций верхнего уровня, которые называются "get" и "set", и используя вместе с вышеприведенным образцом кода. Поэтому я предполагаю, что синтаксический анализатор достаточно умен, чтобы это разрешить. На самом деле, даже следующее кажется законным (если запутать):

var Sample = {
   bs : "",
   get get() { return this.bs; },
   set get(val) { this.bs = val; }
 }

Ответ 3

Настройки JavaScript и Getters:

Обычно методы setter и getter следуют следующему синтаксису в объектах JavaScript. Объект создается с несколькими свойствами. Метод setter имеет один аргумент, в то время как метод getter не имеет аргументов. Обе функции.

Для заданного свойства, которое уже создано внутри объекта, метод set обычно является оператором if/else, который проверяет ввод в любое время, когда свойство напрямую получает доступ и назначается позже через код, a.k.a. "set". Это часто делается с помощью оператора if (typeof [arg] === 'определенного типа значения, такого как: число, строка или логическое выражение), тогда блок кода обычно назначает это. (Конкретное) имя свойства к аргументу. (Иногда с записью сообщений на консоль.) Но ему ничего не нужно возвращать; он просто устанавливает значение this.specific-property для оценки аргумента. Однако оператор else почти всегда имеет (сообщение об ошибке) сообщение с консолью, в котором пользователю предлагается ввести другое значение для значения ключа свойства, которое соответствует условию if.

Метод геттера в принципе противоположный. Он устанавливает функцию без каких-либо аргументов для "получения", т.е. Возвращает значение (ноль)/свойство, когда вы вызываете специфическое свойство, которое вы только что установили. Он "получает" вас что-то другое, чем то, что вы обычно получаете в ответ на вызов этого свойства объекта.

Значение сеттеров и геттеров можно легко увидеть для значений ключа свойств, которые вы не хотите изменять напрямую, если не выполняются определенные условия. Для свойств этого типа используйте подчеркивание, чтобы продолжить имя свойства, и используйте геттер, чтобы вы могли вызвать свойство без подчеркивания. Затем используйте установщик, чтобы определить условия, по которым можно получить доступ и значение ключа свойства, a.k.a. "set". Например, я буду включать в себя два базовых сеттера и геттеры для этих свойств объекта. Примечание. Я использую постоянную переменную, потому что объекты остаются изменяемыми (после создания).

const person = {
_name: 'Sean';
_age: 27;

set age(ageIn) {
if (typeof ageIn === 'number') {
  this._age = ageIn;
}
else {
  console.log(`${ageIn} is invalid for the age key-value. Change ${ageIn} to/into a Number.`);
  return 'Invalid Input.';
}
},

get age() {
return this._age;
},

set name(nameIn) {
if (typeof nameIn === 'string') {
        this._name = nameIn;
      } else {
        console.log(`Change ${nameIn} to/into a(ny) String for the name 
key-value.`);
        return 'Invalid Input.';
    }
},

get name() {
return this._name;
}

};

Интересно, когда вы пытаетесь установить/присвоить новое значение ключа для свойства _age, потому что оно должно соответствовать условию if, чтобы быть успешно присвоенным, то есть не все присвоения действительны и т.д.

person.age = 'twenty-eight'; /* output: twenty-eight is invalid for the 
age key-value.  Change twenty-eight to/into a Number. */
console.log(person.age); // output: 27 (twenty-eight was never assigned)
person.age = 28; // output: none
console.log(person.age); // output: 28

Обратите внимание, как мне удалось получить доступ к свойству person._age через свойство person.age благодаря методу getter. Кроме того, подобно тому, как вход для возраста был ограничен числами, вход для свойства name теперь ограничен/установлен только для строк.

Надеюсь, это поможет мне разобраться! Кроме того, некоторые ссылки для более:

https://johnresig.com/blog/javascript-getters-and-setters/

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get

https://www.infragistics.com/community/blogs/infragistics/archive/2017/09/19/easy-javascript-part-8-what-are-getters-and-setters.aspx