我不了解如何在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
我如何隔离它们?
答案 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提供的轻松创建误导性别名。