将javascript普通对象转换为模型类实例

sil*_*der 11 javascript odm ecmascript-6

我需要实现小型ODM功能.我从数据库中获得了简单的javascript对象,我需要将其转换为我的模型类实例.让我们假设模型看起来像:

    class Model{
       constructor(){
           this.a = '777';
           ---- whole bunch of other things ---
       }
       print(){
           console.log(this.a);
       }
   }
Run Code Online (Sandbox Code Playgroud)

所以我需要转换var a = {b:999, c:666}为模型的实例并且能够在a.print()之后调用,并且在a.print()执行时777应该放在控制台中.怎么做?

jun*_*lin 12

有一个简单的方法.只需将对象分配给实例(this)

class Model
{
  constructor(obj){
    Object.assign(this, obj)
  }
  print(){
    console.log(this.a);
  }
}

let obj = {a: 'a', b: 'b', c: 'c'}
    
let m = new Model(obj)
console.log(m)
m.print()  // 'a'
Run Code Online (Sandbox Code Playgroud)


Cod*_*gue 8

如果我正确理解了这个问题,您可以导出工厂函数并利用Object.assign来扩展您的基础Model

// Export the factory function for creating Model instances
export default const createModel = function createModel(a) {
  const model = new Model();
  return Object.assign(model, a);
};
// Define your base class
class Model {
  constructor() {
    this.a = 777;
  }
  print() {
    console.log(this.a, this.b, this.c)
  }
}
Run Code Online (Sandbox Code Playgroud)

并称之为:

const myModel = createModel({ b: 999, c: 666 });
myModel.print();
Run Code Online (Sandbox Code Playgroud)

Babel REPL 示例

或者,当然,您可以放弃工厂并a作为参数(或其余参数)传递给构造函数,但这取决于您首选的编码风格。

  • 我会推荐`class Model { static create(a) { ... } ... }`,也许还有一个更具描述性的名字,比如`createFrom` 或`fromJSON` (2认同)

G_h*_*hi3 1

这个怎么样?:

var a = Object.create(Model.prototype, {
    b: {
        enumerable: true, // makes it visible for Object.keys()
        writable: true, // makes the property writable
        value: 999
    }, c: {
        value: 666
    }
});
Run Code Online (Sandbox Code Playgroud)

您基本上是从模型的原型创建一个新的模型实例,并将新属性分配给它。print您也应该能够打电话。