Геттеры \ сеттеры для чайников - PullRequest
123 голосов
/ 01 мая 2009

Я пытался разобраться с геттерами и сеттерами, и он не тонет. Я прочитал Методы получения и установки JavaScript и Определение методов получения и установки , но просто получить его.

Может кто-то четко заявить:

  1. Для чего предназначены геттер и сеттер, и
  2. Приведите ОЧЕНЬ простые примеры?

Ответы [ 12 ]

1 голос
/ 02 мая 2009

Если вы ссылаетесь на концепцию методов доступа, то простая цель - скрыть базовое хранилище от произвольных манипуляций. Самый экстремальный механизм для этого -

function Foo(someValue) {
    this.getValue = function() { return someValue; }
    return this;
}

var myFoo = new Foo(5);
/* We can read someValue through getValue(), but there is no mechanism
 * to modify it -- hurrah, we have achieved encapsulation!
 */
myFoo.getValue();

Если вы имеете в виду фактическую функцию получения / установки JS, например. defineGetter / defineSetter или { get Foo() { /* code */ } }, тогда стоит отметить, что в большинстве современных движков последующее использование этих свойств будет намного медленнее, чем это было бы в противном случае. например. сравнить производительность

var a = { getValue: function(){ return 5; }; }
for (var i = 0; i < 100000; i++)
    a.getValue();

против

var a = { get value(){ return 5; }; }
for (var i = 0; i < 100000; i++)
    a.value;
0 голосов
/ 09 июля 2010

У меня есть один для вас, ребята, который может быть немного уродливым, но это действительно делается на разных платформах

function myFunc () {

var _myAttribute = "default";

this.myAttribute = function() {
    if (arguments.length > 0) _myAttribute = arguments[0];
    return _myAttribute;
}
}

таким образом, когда вы звоните

var test = new myFunc();
test.myAttribute(); //-> "default"
test.myAttribute("ok"); //-> "ok"
test.myAttribute(); //-> "ok"

Если вы действительно хотите оживить вещи ... вы можете вставить проверку typeof:

if (arguments.length > 0 && typeof arguments[0] == "boolean") _myAttribute = arguments[0];
if (arguments.length > 0 && typeof arguments[0] == "number") _myAttribute = arguments[0];
if (arguments.length > 0 && typeof arguments[0] == "string") _myAttribute = arguments[0];

или сумасшедший с расширенной проверкой typeof: код type.of () на codingforums.com

...