Установщики и геттеры свойств в Loopback.io

Я хотел бы знать, насколько безопасно использование свойств setter и getter из класса модели.

Это уже используется в пользовательской модели обратной связи, и ее можно увидеть здесь: Код пользователя

Почему это нигде не задокументировано? Можем ли мы его использовать?


person mitsos1os    schedule 04.05.2016    source источник


Ответы (2)


Я все еще ищу «официальную» документацию, но наш главный инженер задокументировал ее в другом ответе SO здесь: https://stackoverflow.com/a/24253273/52160.

Если я смогу найти официальную поддержку в документах, я обновлю вопрос.

person Raymond Camden    schedule 05.05.2016
comment
Спасибо за Ваш ответ! Я уже видел это. Мне было интересно, может ли кто-нибудь официально подтвердить это... В любом случае, я оставлю вопрос открытым, пока он полностью не будет проверен. - person mitsos1os; 05.05.2016

На самом деле, немного покопавшись, я обнаружил, что это на самом деле используется и определено в классе ModelBuilder модуля loopback-datasource-juggler. Он определяется здесь

ModelClass.setter = {};

И использовал здесь

Object.defineProperty(ModelClass.prototype, propertyName, {
  get: function() {
    if (ModelClass.getter[propertyName]) {
      return ModelClass.getter[propertyName].call(this); // Try getter first
    } else {
      return this.__data && this.__data[propertyName]; // Try __data
    }
  },
  set: function(value) {
    var DataType = ModelClass.definition.properties[propertyName].type;
    if (Array.isArray(DataType) || DataType === Array) {
      DataType = List;
    } else if (DataType === Date) {
      DataType = DateType;
    } else if (DataType === Boolean) {
      DataType = BooleanType;
    } else if (typeof DataType === 'string') {
      DataType = modelBuilder.resolveType(DataType);
    }

    var persistUndefinedAsNull = ModelClass.definition.settings.persistUndefinedAsNull;
    if (value === undefined && persistUndefinedAsNull) {
      value = null;
    }

    if (ModelClass.setter[propertyName]) {
      ModelClass.setter[propertyName].call(this, value); // Try setter first
    } else {
      this.__data = this.__data || {};
      if (value === null || value === undefined) {
        this.__data[propertyName] = value;
      } else {
        if (DataType === List) {
          this.__data[propertyName] = DataType(value, properties[propertyName].type, this.__data);
        } else {
          // Assume the type constructor handles Constructor() call
          // If not, we should call new DataType(value).valueOf();
          this.__data[propertyName] = (value instanceof DataType) ? value : DataType(value);
        }
      }
    }
  },
  configurable: true,
  enumerable: true,
});

Так что это, вероятно, реализовано, но не задокументировано...

person mitsos1os    schedule 05.05.2016