复制对象字面的更美观方式?

时间:2017-06-09 23:00:42

标签: javascript

这是客户端。 Webpack,Babel和Babel Imports。

我的项目有一个名为" models"的文件夹。其中包含对象文字作为端点的预期JSON结果的定义。

对象只包含字符串,整数,布尔值和包含这些数据类型的数组/对象

例如:

{
    name: "String"
    age: 35,
    active: true,
    permissions: [
        { news: true }
    ]
}

当我想使用模型定义时,为了确保我没有引用问题,我必须使用:

let newObject1 = Object.assign({}, originalObj )

let newObject2 = JSON.parse( JSON.stringify( originalObj ))

我发现这有点难看,它会污染我的代码。

我希望能够在对象文字上使用new关键字,但当然这不是一件事。

let clone = new targetObj

在不创建引用的情况下,处理克隆对象文字的最美观方法是什么?

2 个答案:

答案 0 :(得分:2)

实现此类对象的JavaScript方式"模板"是建设者:



function Original() {
    this.name = "String";
    this.age = 18;
    this.active = true;
    this.permissions =  [
        { news: true }
    ];
}

var obj = new Original();

console.log(obj);




或者,在ES6 class语法中:



class Original {
    constructor() {
        this.name = "String";
        this.age = 18;
        this.active = true;
        this.permissions =  [
            { news: true }
        ];
    }
}

let obj = new Original();

console.log(obj);




请注意,Object.assign只会创建一个浅表副本,因此它不会复制permissions数组,而是提供与原始数据相同的相同数组的引用对象



const originalObject = {
    name: "String",
    age: 35,
    active: true,
    permissions: [
        { news: true }
    ]
};

let obj1 = Object.assign({}, originalObject);
let obj2 = Object.assign({}, originalObject);

// change a permission:
obj1.permissions[0].news = false;
// See what permissions are in obj2:
console.log(obj1.permissions);




答案 1 :(得分:1)

const model = () => ({
    name: 'string',
    age: 20,
    array: [ 1, 2, 3 ]
});

let newObject = model();

您无法使用new - 请参阅trincot的答案 - 但您不必担心嵌套对象(assign)或感觉粗略(stringify + parse)。