为什么我继承的静态属性没有值?

时间:2018-02-23 00:32:41

标签: javascript node.js class inheritance ecmascript-6

我正在为我正在做的项目构建一个ORM。我在ORM中有两个类,BaseModelSessionLink,并且它们外部的函数都试图使用它们。 BaseModel是基本模型 - 其他模型继承的模型,以便我可以定义常见行为。 SessionLink是继承模型之一。

我希望能够使用继承的模型从BaseModel链接查询方法。像这样:

SessionLink.join("a table").where({some: "conditions"}).get()

为了做到这一点,我需要在BaseModel上有一个静态属性来存储通过链式方法构建的查询。到现在为止还挺好。我把这个静态属性放在了getter和setter中。

class BaseModel {
  static get queryBuilder() {
    return this._query || null;
  }

  static set queryBuilder(val) {
    this._query = val;
  }

  static join(table) {
    if (this.queryBuilder) {
      // Add to existing query
      this.queryBuilder = this.queryBuilder.addJoin(table);
    }
    else {
      // Create a new query, store it in queryBuilder
      this.queryBuilder = new Query().addJoin(table);
    }
  }

  static where(conditions) {
    // Implementation similar to .join
  }

  static get() {
    // Actually send the query to the database and return results
    magicallyGetDatabaseConnection().sendQuery(this.queryBuilder);
  }
}

SessionLink只是继承自BaseModelclass SessionLink extends BaseModel),并添加了一些与此问题无关的特定于模型的详细信息。

我遇到的问题是:queryBuilder没有保留其价值。我可以从this.queryBuilder = new Query(...)join或任何地方运行where,然后在下一行上记录this.queryBuilder 的值,然后返回null。换句话说:

static join(table) {
  if (this.queryBuilder) {
    // Add to existing query
    this.queryBuilder = this.queryBuilder.addJoin(table);
  }
  else {
    // Create a new query, store it in queryBuilder
    this.queryBuilder = new Query().addJoin(table);

    console.log(this.queryBuilder); // null
  }
}

这是为什么?我该如何解决?

1 个答案:

答案 0 :(得分:2)

您可以通过不在一行中实例化和调用addJoin来解决此问题:

this.queryBuilder = new Query()
this.queryBuilder.addJoin(table)

或者从this方法

返回addJoin()
class Query {
   addJoin(table) {
      // existing code
      return this
   }
}