Я пытаюсь получить мою голову вокруг геттеры и сеттеры и его не тонет. Я читал JavaScript геттеры и сеттеры и Defining геттеры и сеттеры и просто не получить его.
Может кто-то четко заявить:
- Для чего предназначены геттер и сеттер, и
- Приведите ОЧЕНЬ простые примеры?
javascript
setter
getter
Александр Абакумов
источник
источник
a = setValue(5);
наa = 5;
иsetValue()
, следовательно, будет вызван под капотом, чтобы делать все, что угодно.Ответы:
В дополнение к ответу @ millimoose , сеттеры также могут использоваться для обновления других значений.
Теперь вы можете установить
fullName
,first
иlast
будет обновляться, и наоборот.источник
Object.defineProperty
функцию, которая может определять методы получения и установки.this.__defineGetter__
или более новуюObject.defineProperty
функцию.Name.prototype.constructor
? Похоже, плохая альтернатива Ответу миллимузы .Геттеры и сеттеры в JavaScript
обзор
Методы получения и установки в JavaScript используются для определения вычисляемых свойств или методов доступа . Вычисляемое свойство - это свойство, которое использует функцию для получения или установки значения объекта. Основная теория делает что-то вроде этого:
Это полезно для автоматического выполнения действий за кулисами при обращении к свойству, таких как сохранение чисел в диапазоне, переформатирование строк, запуск событий с измененными значениями, обновление реляционных данных, предоставление доступа к частным свойствам и многое другое.
В приведенных ниже примерах показан базовый синтаксис, хотя они просто получают и устанавливают значение внутреннего объекта, не делая ничего особенного. В реальных случаях вы должны изменить входное и / или выходное значение в соответствии с вашими потребностями, как указано выше.
получить / установить ключевые слова
ECMAScript 5 поддерживает
get
иset
ключевые слова для определения вычисляемых свойств. Они работают со всеми современными браузерами, кроме IE 8 и ниже.Пользовательские геттеры и сеттеры
get
иset
не являются зарезервированными словами, поэтому они могут быть перегружены для создания ваших собственных функций вычисляемых свойств кросс-браузера. Это будет работать в любом браузере.Или для более компактного подхода можно использовать одну функцию.
Избегайте таких действий, которые могут привести к раздуванию кода.
В приведенных выше примерах имена внутренних свойств абстрагируются с подчеркиванием, чтобы не дать пользователям просто делать «
foo.bar
против»foo.get( 'bar' )
и получать «сырое» значение. Вы можете использовать условный код для различных действий в зависимости от имени свойства, к которому осуществляется доступ (черезname
параметр).Object.defineProperty ()
Использование
Object.defineProperty()
- это еще один способ добавления методов получения и установки, и его можно использовать для объектов после их определения. Его также можно использовать для установки настраиваемых и перечислимых поведений. Этот синтаксис также работает с IE 8, но, к сожалению, только для объектов DOM.__defineGetter __ ()
Наконец,
__defineGetter__()
еще один вариант. Он устарел, но все еще широко используется в Интернете и поэтому вряд ли исчезнет в ближайшее время. Он работает во всех браузерах, кроме IE 10 и ниже. Хотя другие опции также хорошо работают не в IE, поэтому этот вариант не так полезен.Также стоит отметить, что в последних примерах внутренние имена должны отличаться от имен доступа, чтобы избежать рекурсии (т.
foo.bar
Е.foo.get(bar)
Вызывающийfoo.bar
вызов вызывающийfoo.get(bar)
...).Смотрите также
MDN get , set , Object.defineProperty () , __defineGetter __ () , __defineSetter __ ()
MSDN IE8 Getter Поддержка
источник
this[ '_' + name ] = value;
может бытьthis[ '_' + name ] = arguments[1];
и не было бы никакой необходимости указыватьvalue
аргумент.var foo = { bar : 123, get bar(){ return bar; }, set bar( value ){ this.bar = value; } }; foo.bar = 456;
Вызывает исключение: Uncaught RangeError: Максимальный размер стека вызовов превышен на панели Object.set [как бар] (<аноним>: 4: 32) на панели Object.set [как бар] (<аноним>: 4: 32 ) на панели Object.set [as bar] (<anonymous>: 4: 32) на панели Object.set [as bar] (<anonymous>: 4: 32) на панели Object.set [as bar] (<anonymous> : 4: 32) на панели Object.set [as bar] (<аноним>: 4: 32)bar: 123
иthis.bar = value
т. Д. Измените их,_bar
например. Смотрите: hongkiat.com/blog/getters-setters-javascript_foo
илиmFoo
. Если он такой же, как метод получения / установки, он вызовет бесконечный цикл из-за рекурсии, а затем переполнения стека ™ ;-), потому что когда вы говорите a = b, он вызывает a.get (b), который сам вызывает a = b , который вызывает a.get (b), ...Вы могли бы использовать их, например, для реализации вычисляемых свойств.
Например:
(CodePen)
источник
Object.defineProperties
.Извините, что воскресил старый вопрос, но я подумал, что могу привести пару очень простых примеров и пояснений. Ни один из других ответов, опубликованных таким образом, не иллюстрирует синтаксис, как первый пример руководства по MDN , который является настолько базовым, насколько это возможно.
Getter:
... войдет
John Smith
, конечно. А геттерные ведет себя как свойство изменяемого объекта, но обеспечивает гибкость функции для расчета ее возвращаемое значение на лету. Это в основном причудливый способ создать функцию, которая не требует () при вызове.сеттер:
... войдет
New York
в консоль. Как добытчики, сеттеры называются с тем же синтаксисом, установив значение свойства объекта, но есть еще один необычный способ вызвать функцию без ().Смотрите этот jsfiddle для более подробного, возможно, более практического примера. Передача значений в установщик объекта запускает создание или заполнение других элементов объекта. В частности, в примере с jsfiddle, передача массива чисел побуждает установщика вычислять среднее значение, медиану, моду и диапазон; затем устанавливает свойства объекта для каждого результата.
источник
maps.roll
как свойство, а неmaps.roll()
как возвращаемое значение val. Это просто предпочтение.maps.roll()
Методы получения и установки действительно имеют смысл, только когда у вас есть частные свойства классов. Поскольку Javascript на самом деле не имеет свойств закрытого класса, как вы обычно думаете из Object Oriented Languages, это может быть трудно понять. Вот один пример частного счетчика объекта. Хорошая вещь об этом объекте - то, что внутренняя переменная "count" не может быть доступна извне объекта.
Если вы все еще в замешательстве, взгляните на статью Крокфорда о частных членах в Javascript .
источник
var baz = foo.bar
за этим стоит полный набор скрытого поведения. Я бы ожидать , что сfoo.getBar()
, однако.Я думаю, что первая статья, на которую вы ссылаетесь, довольно ясно заявляет:
Цель здесь - инкапсулировать и абстрагировать поля, предоставляя им доступ только через метод
get()
илиset()
. Таким образом, вы можете хранить поле / данные внутри себя любым удобным вам способом, но внешние компоненты находятся только вне вашего опубликованного интерфейса. Это позволяет вам вносить внутренние изменения без изменения внешних интерфейсов, выполнять некоторую проверку или проверку ошибок вset()
методе и т. Д.источник
Хотя часто мы привыкли видеть объекты с открытыми свойствами без какого-либо контроля доступа, JavaScript позволяет нам точно описывать свойства. Фактически, мы можем использовать дескрипторы, чтобы контролировать, как можно получить доступ к свойству и какую логику мы можем применить к нему. Рассмотрим следующий пример:
Конечный результат:
источник
Что в этом запутанного ... геттеры - это функции, которые вызываются, когда вы получаете свойство, сеттеры, когда вы его устанавливаете. Например, если вы делаете
Вы устанавливаете свойство prop, если вы используете getter / setters, то будет вызываться функция setter с «abc» в качестве аргумента. Определение функции сеттера внутри объекта в идеале должно выглядеть примерно так:
Я не уверен, насколько хорошо это реализовано в браузерах. Похоже, у Firefox также есть альтернативный синтаксис с специальными («волшебными») методами с двойным подчеркиванием. Как обычно, Internet Explorer не поддерживает ничего из этого.
источник
Вы можете определить метод экземпляра для класса js через прототип конструктора.
Ниже приведен пример кода:
И это должно работать для любого браузера, вы также можете просто использовать nodejs для запуска этого кода.
источник
Я также был несколько смущен прочитанным объяснением , потому что я пытался добавить свойство к существующему прототипу, которое я не написал, поэтому замена прототипа казалась неправильным подходом. Итак, для потомков вот как я добавил
last
свойствоArray
:Немного приятнее, чем добавление функции IMHO.
источник
Если вы ссылаетесь на концепцию методов доступа, то простая цель - скрыть базовое хранилище от произвольных манипуляций. Самый экстремальный механизм для этого
Если вы имеете в виду фактическую функцию получения / установки JS, например.
defineGetter
/defineSetter
, или{ get Foo() { /* code */ } }
, тогда стоит отметить, что в большинстве современных движков последующее использование этих свойств будет намного медленнее, чем это было бы в противном случае. например. сравнить производительностьпротив
источник
У меня есть один для вас, ребята, который может быть немного уродливым, но это делается на разных платформах
таким образом, когда вы звоните
Если вы действительно хотите оживить вещи ... вы можете вставить проверку typeof:
или сумасшедший с расширенной проверкой typeof: type.of () код в codingforums.com
источник