Есть ли в Javascript ключевые слова get / set, такие как C #? - PullRequest
18 голосов
/ 23 марта 2011

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

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

Ответы [ 3 ]

14 голосов
/ 24 марта 2011

Как предполагает Мартиньо, вот несколько ссылок, объясняющих метод получения / установки в 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; }
 }
2 голосов
/ 23 марта 2011

Согласно Mozilla , они отсутствуют в ECMAScript.

0 голосов
/ 26 октября 2017

JavaScript Setter And Getter:

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

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

...