Есть ли в Javascript ключевые слова get/set, такие как C#?

Я работаю с 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" приводит к синтаксической ошибке. Переименование их во что-либо другое является синтаксической ошибкой. Они действительно кажутся ключевыми словами.

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


person chinchilla    schedule 23.03.2011    source источник
comment
Вздох. И сразу после запроса нахожу соответствующую ссылку. Это Javascript 1.5:   -  person chinchilla    schedule 23.03.2011
comment
Это работает в некоторых версиях Chrome, но вам лучше использовать геттеры/сеттеры без ключевого слова.   -  person    schedule 23.03.2011
comment
вы можете опубликовать соответствующую ссылку, которую вы нашли в ответе, немного подождать (это обязательно), а затем принять этот ответ. Это поможет другим, которые ищут то же самое, вы, вероятно, наберете несколько очков репутации и почувствуете то теплое нечеткое чувство, которое приходит, когда вы делаете Интернет лучше.   -  person R. Martinho Fernandes    schedule 23.03.2011
comment
Я не нашел много статей с этим относительно назначения геттеров и сеттеров, если у вас есть объект, созданный с помощью функции аля 'function a(){}; а.прототип.х = ?' Я не могу заставить его работать. Это довольно удобно в некоторых случаях.   -  person Neon Warge    schedule 04.11.2015


Ответы (3)


Как предложил Мартиньо, вот несколько ссылок, объясняющих геттеры/сеттеры в 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; }
 }
person chinchilla    schedule 24.03.2011
comment
Вау, как на самом деле разбирается set get? - person Pacerier; 05.06.2014

Согласно Mozilla, они не в ECMAScript.

person Daniel A. White    schedule 23.03.2011

Сеттеры и геттеры JavaScript:

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

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

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

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

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's 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's 
key-value.`);
        return 'Invalid Input.';
    }
},

get name() {
return this._name;
}

};

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

person.age = 'twenty-eight'; /* output: twenty-eight is invalid for the 
age's 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 благодаря методу получения. Кроме того, аналогично тому, как ввод для возраста был ограничен числами, ввод для свойства имени теперь ограничен/задается только строками.

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

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< /а>

person Sean Tank Garvey    schedule 26.10.2017