json javascript类示例属性到普通对象

6qfn3psc  于 2023-05-19  发布在  Java
关注(0)|答案(2)|浏览(124)

我有一个类的示例

class MyObject{
    id: number = 0;
    data: string = "";

    constructor(){

    }

    toString(){
        return `${this.id}: ${this.data}`;
    }

    
}

const myObj = new MyObject()
myObj.data = "hello"

如何将其转换为纯JS对象:

const output = {id: 10, data: "hello"}

我知道这是可行的,但一定有一种方法不序列化整个对象:

const output = JSON.parse(JSON.stringify(myObj))

最好的办法是什么?
请注意,我正在寻找一个通用的解决方案,而不是像这样:

toObject() {
    return {
      id: this.id,
      data: this.data,
    };
  }
pgpifvop

pgpifvop1#

要创建一个只包含示例的属性而不包含示例的方法的对象,可以使用Object.assign()将对象的所有可枚举的own属性复制到另一个对象,该对象可以指定为一个新的普通对象。

class MyObject{
    id = 0;
    data = "";

    constructor(){
    }

    toString(){
        return `${this.id}: ${this.data}`;
    }

    
}

const instance = new MyObject();
const properties = Object.assign({}, instance);
console.log(properties);
2lpgd968

2lpgd9682#

对于简单的情况,您可以使用对象文字传播语法:

class MyObject{
    constructor(){
        this.id = 0;
        this.data = "";
    }
    toString(){
        return `${this.id}: ${this.data}`;
    }
}

const myObj = new MyObject();
console.log(myObj.constructor.name); // MyObject
myObj.data = "hello";
const result = {...myObj};
console.log(result.constructor.name); // Object

如果原始对象有嵌套的自定义对象(也需要转换为普通对象或数组),那么可以创建一个递归函数,或者使用structuredClone函数(在ECMAScript 2023中添加,节点17)。下面是一个更实际的链表实现示例:

class Node {
    constructor(value, next) {
        this.value = value;
        this.next = next;
    }
    *[Symbol.iterator]() {
        yield this.value;
        if (this.next) yield* this.next;
    }
}

class LinkedList {
    constructor(...values) {
        this.head = null;
        for (const value of values.toReversed()) {
            this.head = new Node(value, this.head);
        }
    }
    *[Symbol.iterator]() {
        if (this.head) yield* this.head
    }
    toString() {
        return [...this].join("→");
    }
}

const myObj = new LinkedList(1, 2, 3);
console.log("list: ", myObj.constructor.name, myObj.toString());
const result = structuredClone(myObj);
console.log("list2: ", result.constructor.name, myObj);

然而,请注意,这 * 确实 * 在幕后序列化/反序列化整个对象,并且在涉及本机类的情况下,它们也在目标对象中维护(如SetMapDateRegExpNumber...)。这可能是你想要的,也可能不是,但是要知道,在这种情况下,JSON.stringify也有 * 特定 * 的结果:对于SetMapRegExp,您将得到一个空对象,对于Date,您将得到一个字符串,...等等,因此这可能需要特别注意-取决于预期。

相关问题