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)
如果我正确理解了这个问题,您可以导出工厂函数并利用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)
或者,当然,您可以放弃工厂并a作为参数(或其余参数)传递给构造函数,但这取决于您首选的编码风格。
这个怎么样?:
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您也应该能够打电话。
| 归档时间: |
|
| 查看次数: |
4934 次 |
| 最近记录: |