JavaScript автоматический метод get/методы set (John Resig Book)

Вы можете создать такую ​​обертку, как это:

function get_something(name in varchar2,
                   ignore_notfound in varchar2) return varchar2
is
begin
    return get_something (name, (upper(ignore_notfound) = 'TRUE') );
end;

, а затем вызывать:

select get_something('NAME', 'TRUE') from dual;

Вам решать, какие допустимые значения ignore_notfound находятся в вашей версии, Я предположил, что TRUE означает TRUE, а что-то еще означает FALSE.

18
задан EndangeredMassa 13 January 2009 в 16:56
поделиться

7 ответов

Я запустил это сообщение с единственной цели изучить, почему это, которое вещи произошли, и я наконец, сделало. Таким образом в случае, если существует кто-то еще заинтересованный "whys" здесь, они:

, Почему, 'это' изменяется в анонимной функции?

А новая функция, даже если это - анонимное, объявленный в объекте или другой функции ВСЕГДА, ИЗМЕНЯЕТ ОБЪЕМ в этом случае, возвращающемся к глобальной области видимости (окно)

Решение: все указанные в сообщении, я думаю, что более ясное выполняет анонимную функцию с .call (это)

, Почему getname () всегда возвращает возраст?

, В то время как анонимная функция выполняется сразу же, методы get/методы set выполняются впервые, когда их называют. В тот момент значение [1 114] я всегда буду последним, потому что оно уже выполнило итерации для всех свойств... и будет всегда возвращать свойства [я], который является последним значением, в этом случае возраст.

Решение: сохраняют значение меня в переменной как это

 for ( i in properties ) { (function(){ 
  var j = i
  //from now on use properties[j]

, Это - в основном оно, если я неправ в чем-нибудь, что я сказал, исправьте меня, так как я пытаюсь изучить это...

Еще раз спасибо.

3
ответ дан 30 November 2019 в 09:03
поделиться

РЕДАКТИРОВАНИЕ: теперь, адаптируя ответ Jason, это работает:

Мы должны сделать закрытие для значений. Вот один путь:

function bindAccessors(o, property, value) {
  var _value = value;
  o["get" + property] = function() {
    return _value;
  };
  o["set" + property] = function(v) {
    _value = v;
  };
}

Тогда Пользовательский конструктор похож на это:

function User( properties ) {
  for (var i in properties ) {
    bindAccessors(this, i, properties[i]);
  }
}
4
ответ дан 30 November 2019 в 09:03
поделиться

я думаю, что лучше не использовать new ключевое слово вообще при работе в JavaScript.

Это вызвано тем, что, если Вы тогда инстанцируете объекта без [1 123] использование нового ключевого слова (исключая: var user = User()) по ошибке, *очень плохие вещи произойдут...*reason будучи этим в функции (если инстанцировано без new ключевое слово), эти this будет относиться к глобальный объект , т.е. window...

Поэтому, я предлагаю лучший путь о том, как использовать подобные классу объекты.

Рассматривают следующий пример:

var user = function (props) {
    var pObject = {};
    for (p in props) {
        (function (pc) {
            pObject['set' + pc] = function (v) {
                props[pc] = v;
                return pObject;
            }
            pObject['get' + pc] = function () {
                return props[pc];
            }
        })(p);
    }
    return pObject;
}

В вышеупомянутом примере, я создаю новый объект в функции, и затем присоединяю методов get и методы set к этому недавно созданному объекту.

Наконец, я возвращаю этот недавно созданный объект. Примечание, что this ключевое слово не используется нигде

Затем для 'инстанцирования' user, я сделал бы следующее:

var john = user({name : 'Andreas', age : 21});
john.getname(); //returns 'Andreas'
john.setage(19).getage(); //returns 19

лучший способ постараться не попадать в ловушки, не создавая их во-первых ... В вышеупомянутом примере я избегаю new ловушка ключевого слова (, как я сказал, не используя new ключевое слово, когда это, как предполагается, используется, вызовет плохие вещи произойти ) [1 126] не использование new вообще.

4
ответ дан 30 November 2019 в 09:03
поделиться

Вы, вероятно, хотите что-то вроде этого, которое более читаемо: (закрытия легко изучить, как только Вы получаете некоторую практику)

function User( properties ) {
  // helper function to create closures based on passed-in arguments:
  var bindGetterSetter = function(obj,p,properties)
  {
    obj["get"+p]=function() { return properties[p]; }
    obj["set"+p]=function(val) { properties[p]=val; return this; }
  };
  for (var p in properties)
    bindGetterSetter(this, p, properties);
}

, я также добавил, "возвращают это"; таким образом, можно сделать:

u=new User({a: 1, b:77, c:48});
u.seta(3).setb(20).setc(400)
3
ответ дан 30 November 2019 в 09:03
поделиться

Как записано в OP, this в цикле не называет Пользовательский объект, как это должно быть. При получении той переменной вне цикла можно заставить его работать:

function User( properties ) {
  // Iterate through the properties of the object, and make sure
  // that it's properly scoped (as discussed previously)
 var me = this;
 for ( i in properties ) { (function(){
  // Create a new getter for the property
  me[ "get" + i ] = function() {
    return properties[i];
  };
  // Create a new setter for the property
  me[ "set" + i ] = function(val) {
    properties[i] = val;
  };
 // etc
2
ответ дан 30 November 2019 в 09:03
поделиться

Возможно, переменная я "закрываюсь" с последним значением в повторении ("возраст")? Тогда все методы get и методы set получат доступ к свойствам ["возраст"].

1
ответ дан 30 November 2019 в 09:03
поделиться

Я нашел что-то, что, кажется, ответ, все о контексте. Используя анонимную функцию в для, изменяет контекст, заставляющий 'это' относиться к объекту окна, странному не так ли?

так:

function User( properties ) {

  for ( var i in properties ) { 
     // here this == User Object
    (function(){
     // inside this anonymous function this == window object
    this[ "get" + i ] = function() {
      return properties[i];
    };

    this[ "set" + i ] = function(val) {
      properties[i] = val;
    };
    })(); 
  }
}

я не знаю, почему та функция изменяет контекст выполнения, я не уверен, что это должно сделать это, так или иначе можно протестировать его выполняющий код там и пробующий window.getname (), и это волшебно работает!: S

решение как пресыщенное прежде изменяет контекст, оно может быть сделано как Cooper J, сказал, передав переменную 'меня' и делая функцию закрытием, или можно сделать это:

(function(){
     // inside this anonymous function this == User because we called it with 'call'
    this[ "get" + i ] = function() {
      return properties[i];
    };

    this[ "set" + i ] = function(val) {
      properties[i] = val;
    };
 }).call(this); 

Так или иначе, я все еще добираюсь 44 при выполнении 'getname'... какие-либо идеи?

0
ответ дан 30 November 2019 в 09:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: