Javascript 从object.create()方法返回的新对象似乎覆盖了其原始对象,而这并不是我所期望的

Javascript 从object.create()方法返回的新对象似乎覆盖了其原始对象,而这并不是我所期望的,javascript,Javascript,我是JavaScript世界的新手。 我需要Object.create(foo)方法创建“foo”类型的新对象。但是,如下面的示例中所示,新创建的对象似乎有一些成员属性仍然引用其原始对象的成员属性。因此,如果修改了新值,则新值将覆盖原始值 我知道JavaScript使用的是“通过引用复制”,除了复制原语。但是,正如许多JavaScript指南/引用所说,Object.create(foo)会在每次调用时创建一个新的“foo”对象,不是吗 说到我的例子 "using strict"; var A

我是JavaScript世界的新手。 我需要Object.create(foo)方法创建“foo”类型的新对象。但是,如下面的示例中所示,新创建的对象似乎有一些成员属性仍然引用其原始对象的成员属性。因此,如果修改了新值,则新值将覆盖原始值

我知道JavaScript使用的是“通过引用复制”,除了复制原语。但是,正如许多JavaScript指南/引用所说,Object.create(foo)会在每次调用时创建一个新的“foo”对象,不是吗

说到我的例子

"using strict";
var A = {a:1, b:1, c:1};
var B = Object.create(A);

console.log("// STEP 1 ////////////////////");
B.a = 2; B.b = 2; B.c = 2;
console.log(A); // Object { a: 1, b: 1, c: 1 }
console.log(B); // Object { a: 2, b: 2, c: 2 }

console.log("// STEP 2 ////////////////////");
var AA = {
    _a: Object.create(A),
    _b: Object.create(B)
}
console.log("AA.a = " + AA._a.a + " : " + AA._a.b + " : " + AA._a.c); // AA.a = 1 : 1 : 1
console.log("AA.b = " + AA._b.a + " : " + AA._b.b + " : " + AA._b.c); // AA.b = 2 : 2 : 2

console.log("// STEP 3 ////////////////////");
var BB = Object.create(AA);
console.log("AA.a = " + AA._a.a + " : " + AA._a.b + " : " + AA._a.c); // AA.a = 1 : 1 : 1
console.log("AA.b = " + AA._b.a + " : " + AA._b.b + " : " + AA._b.c); // AA.b = 2 : 2 : 2
console.log("BB.a = " + BB._a.a + " : " + BB._a.b + " : " + BB._a.c); // BB.a = 1 : 1 : 1
console.log("BB.b = " + BB._b.a + " : " + BB._b.b + " : " + BB._b.c); // BB.b = 2 : 2 : 2

console.log("// STEP 4 ////////////////////");
BB._a.a = 3, BB._a.b = 3, BB._a.c = 3;
console.log("AA.a = " + AA._a.a + " : " + AA._a.b + " : " + AA._a.c); // AA.a = 3 : 3 : 3
console.log("AA.b = " + AA._b.a + " : " + AA._b.b + " : " + AA._b.c); // AA.b = 2 : 2 : 2
console.log("BB.a = " + BB._a.a + " : " + BB._a.b + " : " + BB._a.c); // BB.a = 3 : 3 : 3
console.log("BB.b = " + BB._b.a + " : " + BB._b.b + " : " + BB._b.c); // BB.b = 2 : 2 : 2
在第3步之前,我一直期望并理解输出。但是,我在第四步遇到了麻烦。为什么对象BB在这里覆盖AA的成员属性(_a.a、_a.b和_a.c)?现在,我真的对Object.create()方法的行为感到困惑

我针对步骤4的以下输出,如下所示:

BB._a.a = 3, BB._a.b = 3, BB._a.c = 3;
console.log("AA.a = " + AA._a.a + " : " + AA._a.b + " : " + AA._a.c); // AA.a = 1 : 1 : 1
console.log("AA.b = " + AA._b.a + " : " + AA._b.b + " : " + AA._b.c); // AA.b = 2 : 2 : 2
console.log("BB.a = " + BB._a.a + " : " + BB._a.b + " : " + BB._a.c); // BB.a = 3 : 3 : 3
console.log("BB.b = " + BB._b.a + " : " + BB._b.b + " : " + BB._b.c); // BB.b = 2 : 2 : 2
我唯一怀疑的地方是步骤2中成员a和b的声明。Object.create(A)和Object.create(B)的使用可能是问题的原因之一。但我无法说服自己或改善现状

我错过了什么?我应该如何更正代码以获得瞄准结果

----------------我的补充意见从这里开始----------------

在收到@Mark Meyer(谢谢!)的重播后,我理解了Object.create()方法的思想。但是,那么,我们如何以普通的对象编程风格实现一个包含其他类的类呢? 例如:

var CPU = { name: null };
var MB = { name: null };
var PC = { cpu: Object.create(CPU), mb: Object.create(MB) };

var pc1 = Object.create(PC);
pc1.cpu.name = "Intel i7";
pc1.mb.name = "ASUS";

var pc2 = Object.create(PC);
pc2.cpu.name = "AMD ryzen",
pc2.mb.name = "GIGABYTE";

console.log("PC1 has CPU: " + pc1.cpu.name + " MB: " + pc1.mb.name); // PC1 has CPU: AMD ryzen MB: GIGABYTE
console.log("PC2 has CPU: " + pc2.cpu.name + " MB: " + pc2.mb.name); // PC2 has CPU: AMD ryzen MB: GIGABYTE
我现在知道为什么这里pc2会覆盖pc1。我希望pc1和pc2的行为独立。但是,我想不出另一种方法来实现我的目标。有没有办法避免这种情况?

A=Object.create(B)
创建一个新的对象
A
,并将其链接到
B
。它不会将属性复制到
A
。 这意味着
A
可以访问
B
上的属性,如果它本身没有这些属性。当
A
没有某些属性时,它将查看
B
是否有并使用该属性。例如:

var CPU = { name: null };
var MB = { name: null };
var PC = { cpu: Object.create(CPU), mb: Object.create(MB) };

var pc1 = Object.create(PC);
pc1.cpu.name = "Intel i7";
pc1.mb.name = "ASUS";

var pc2 = Object.create(PC);
pc2.cpu.name = "AMD ryzen",
pc2.mb.name = "GIGABYTE";

console.log("PC1 has CPU: " + pc1.cpu.name + " MB: " + pc1.mb.name); // PC1 has CPU: AMD ryzen MB: GIGABYTE
console.log("PC2 has CPU: " + pc2.cpu.name + " MB: " + pc2.mb.name); // PC2 has CPU: AMD ryzen MB: GIGABYTE
设A={A:1,b:1,c:1};
设B=Object.create(A)
log(“B是否有'a'属性?”,B.hasOwnProperty('a'))
log(“A是否有'A'属性?”,A.hasOwnProperty('A'))
console.log(B.a)//访问a.a,因为没有B.a
A.A=10//更改A.A

console.log(B.a)//反映在这里
感谢重播!我理解Object.create()和prototype之间的概念。但是,那么,我们如何用JavaScript实现一个包含其他类的类呢?(例如,实现包含CPU类、MB类、内存类等的PC类)我认为我必须在PC类中的这些成员类的定义中使用Object.create()。。。有没有办法做到这一点?