0

有人可以解释一下这里发生了什么吗?谢谢。

var o = {a:1};
var p = o;
o === p; // true;
o = Object.create(o);
p === o; // false
o.b = 2;
o.a; // 1
b.a; // 1
o.b; // 2
p.b; // undefined

这是怎么回事?尤其是L4。我o在当前范围内分配赋值的 RHS 的值,其中 o 仍然指向在 L1 上创建的原始对象。那么 Object.create 会锁定对象本身,而与变量完全无关?

4

4 回答 4

3
var o = {a:1};
var p = o;

到目前为止,您有 1 个对象和 2 个变量指向它。

o = Object.create(o);

这一行将变量重新分配o给一个由 原型化的新(空)对象o

前一个对象,当前o的原型,仍然由 引用p

字段内容如下:

o.a; // 1 - found in o's prototype (p)
b.a; // 1 - you probably meant p.a? found in p directly
o.b; // 2 - found in o directly
p.b; // not found in p or anywhere in p's prototype chain
于 2013-11-15T08:55:02.900 回答
2
// create a new object and assign it to o
var o = {a:1};

// assign the value of o to the variable p
var p = o;

// o equals p because both variables refer to the same object
o === p; // true;

// create a new object which uses the existing object o as prototype
// overwriting the current value of o with the new object
// It's essentially the same as
// var tmp = {};
// tmp.__proto__ = o;
// o = tmp
o = Object.create(o);

// o and p refer to two different objects now
p === o; // false

// A new property is added to the object o
o.b = 2;

// inherited from the object that o originally referred to
o.a; // 1

// b is not defined anywhere (you probably meant p)
// p still refers to the object created in the first step
b.a; // 1

// the property b was assigned to the new object through o.b = 2
o.b; // 2

// the original object doesn't have a property b
p.b; // undefined
于 2013-11-15T08:58:06.377 回答
1

这是一个显示 DeepCopy 和 ShallowCopy 之间差异的示例

对象是一个引用类型。意味着当我创建对象x时,x只指向对象真正所在的内存(如0x0003f3)

默认情况下,引用的类型对象分配(例如对象 x = a)是浅的,这意味着当我有 2 个引用的类型对象(如 o 和 p)时,当我执行分配 p == 0 时:两个值都引用同一个对象!assingment 仅复制内存偏移量而不是真实对象

意味着您对“p”所做的每一次更改都会反映到“o”。o == p 是 True 因为两者都持有相同的指针。

在第 4 行:o 指向不同的对象,其余的只是显示对“o”的更改不会反映到“p”,因为它们不再指向内存中的同一个对象

于 2013-11-15T08:59:48.563 回答
0

我可以想象有人对重新分配时为什么 p 没有改变 o 感到困惑。

您将 p 分配给 o 并且您认为 p 是对 o 的引用,因为变异 o 会变异 p 但重新分配 o 不会重新分配 p (所以不是通过引用?)。

var o = {one:1};
p = o;
o.one="uno";//mutating o
o = {two:2};//re assigning o
console.log(p);//Object { one="uno"}

我认为这是因为 JS 分配并传递了引用的值。有人告诉你,在 JS 中通过引用是不可能的,而 JS 总是按值传递。如果这是真的,那么您将无法改变传递/分配的值。我认为 Python 的行为方式相同。

于 2013-11-15T13:21:27.873 回答