Loopback.io中的属性设置器和getter

时间:2016-05-04 16:14:19

标签: loopbackjs setter getter strongloop

我想知道从模型类中使用 setter getter 属性的安全性。

这已经在环回用户模型中使用,可以在这里看到:User Code

为什么没有记录在任何地方?我们可以使用吗?

2 个答案:

答案 0 :(得分:3)

我仍在寻找“官方”文档,但我们的主要工程师在另一个SO答案中记录了它:https://stackoverflow.com/a/24253273/52160

如果我能在文档中找到官方支持,我会更新问题。

答案 1 :(得分:1)

实际上,通过深入挖掘,我发现这实际上是在Loopback-datasource-juggler模块的ModelBuilder类中使用和定义的。 它定义为here

ModelClass.setter = {};

使用here

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,
});

所以它可能已实施,但没有记录......