为什么两个Object.create()调用导致合并?

时间:2017-09-18 22:29:29

标签: javascript node.js object

我不了解如何在JavaScript中使用Object.create()。为什么在这段代码中,两个对象a和b合并,而它们是在两个不同的上下文中声明的?

var l = {
   a: null,
   b: null
}

function a() {
    var a = Object.create(l);
    a.a = "a";
    console.log('a : ', a.a, a.b);
}

function b() {
    var b = Object.create(l);
    b.b = "b";
    console.log('b : ' + b.a, b.b);
}

function main() {
   a();
   b();
}

main();

这是输出:

a :  a null
b :  a b

我如何隔离它们?

2 个答案:

答案 0 :(得分:1)

我认为您误将let label1Width = label1.bounds.width let label2Width = label2.bounds.width if label1Width > label2Width { label2.frame.size.width = label1Width } if label2Width > label1Width { label1.frame.size.width = label2Width } 误认为是Object.create

Object.assign

如果您希望功能的对象被隔离" (我想你在谈论没有副作用)你想要创建新对象,例如使用// This is not what you want var a = Object.create(l); // Do this instead var a = Object.assign({}, l); (而不是Object.assign)。

答案 1 :(得分:0)

Object.create 的目的是根据参数的原型创建一个新对象;有关详情,请参阅here。在运行OP的源代码时,我发现结果令人惊讶;你自己看:

var l = {
   a: null,
   b: null
}

function a() {
    var a = Object.create(l);
    a.a = "a";
    console.log('a : ', a.a, a.b);
}

function b() {
    var b = Object.create(l);
    b.b = "b";
    console.log('b : ' + b.a, b.b);
}

function main() {
   a();
   b();
}

main();

基于原型object l创建两个对象,并且两个新对象的属性保持彼此独立。函数a()通过将obj a设置为值“a”来改变property a,并且其property b保持为空 - 结果由控制台记录。函数b()的行为方式与obj b类似,将property b设置为“b”,而property a保持为空。

如果您使用Object.assign而未指定对象目标(例如{}),则会产生合并。此外,如果强制Object.create为Object.assign的别名,则可能发生合并,如下所示:

// Very bad idea but feasible:
Object.create = Object.assign;

var l = {
   a: null,
   b: null
}

function a() {
    var a = Object.create(l);
    a.a = "a";
    console.log('a : ', a.a, a.b);
}

function b() {
    var b = Object.create(l);
    b.b = "b";
    console.log('b : ' + b.a, b.b);
}

function main() {
   a();
   b();
}

main();

此代码说明了将object l作为双重任务作为分配对象和目标对象的后果。另外,请注意JavaScript提供的轻松创建误导性别名。