当前位置:  开发笔记 > 编程语言 > 正文

将javascript类实例转换为纯对象保存方法

如何解决《将javascript类实例转换为纯对象保存方法》经验,为你挑选了0个好方法。

我想将实例类转换为普通对象,而又不会丢失方法和/或继承的属性。因此,例如:

class Human {
    height: number;
    weight: number;
    constructor() {
        this.height = 180;
        this.weight = 180;
    }
    getWeight() { return this.weight; }
    // I want this function to convert the child instance
    // accordingly
    toJSON() {
        // ???
        return {};
    }
}
class Person extends Human {
    public name: string;
    constructor() {
        super();
        this.name = 'Doe';
    }
    public getName() {
        return this.name;
    }
}
class PersonWorker extends Person {
    constructor() {
        super();
    }
    public report() {
        console.log('I am Working');
    }
    public test() {
        console.log('something');
    }
}
let p = new PersonWorker;
let jsoned = p.toJSON();

jsoned 应该看起来像这样:

{
    // from Human class
    height: 180,
    weight: 180,
    // when called should return this object's value of weight property
    getWeight: function() {return this.weight},

    // from Person class
    name: 'Doe'
    getName(): function() {return this.name},

    // and from PersonWorker class
    report: function() { console.log('I am Working'); },

    test: function() { console.log('something'); }
}

这有可能实现吗?如果可以,如何实现?

如果您想知道,我需要这个,因为不幸的是,我正在使用一个仅接受json对象作为输入的框架,而我却尝试使用typescriptclass继承。

另外,我一次进行了上述转换,因此性能不是要考虑的问题。

更新

如果将编译器的target选项设置为,则由迭代对象属性组成的解决方案将不起作用es6。在上es5,通过迭代对象属性(使用Object.keys(instance))的现有实现将起作用。

到目前为止,我已经实现了:

toJSON(proto?: any) {
    // ???

    let jsoned: any = {};
    let toConvert = proto || this;

    Object.getOwnPropertyNames(toConvert).forEach((prop) => {
        const val = toConvert[prop];
        // don't include those
        if (prop === 'toJSON' || prop === 'constructor') {
            return;
        }
        if (typeof val === 'function') {
            jsoned[prop] = val.bind(this);
            return;
        }
        jsoned[prop] = val;
        const proto = Object.getPrototypeOf(toConvert);
        if (proto !== null) {
            Object.keys(this.toJSON(proto)).forEach(key => {
                if (!!jsoned[key] || key === 'constructor' || key === 'toJSON') return;
                if (typeof proto[key] === 'function') {
                    jsoned[key] = proto[key].bind(this);
                    return;
                }
                jsoned[key] = proto[key];
            });
        }
    });
    return jsoned;
}

但这仍然行不通。结果对象仅包括所有类的所有属性,而仅包括中的方法PersonWorker。我在这里想念什么?

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有