对象保留引用的轨迹,但不将其保留在对象中

时间:2019-06-19 13:34:43

标签: javascript object reference

将对象传递为参数并使用Object.create来创建单独的对象时,将获得一个空对象。 但是,如果您随后使用这个新对象引用在初始对象中设置的特定参数,则会获得初始对象的参数值。

我希望这些值包含在新对象中,或者至少不能在其中包含。

var o = { baz: [] };
o.rrr = { a: 1 };
console.log( o, '"o" before timeout called' );

setTimeout(function() { n(o) }, 1000); // setting delay

function n(x) {
  console.log( 'x - what we passed', x );
  var obj = Object.create( x );
  console.log( obj, '"obj" before enhancements is empty' );
  console.log( obj.rrr, 'but "obj.rrr" do exist' );
  obj.baz = [];

  obj.baz.push( 'new value' );
  console.log( obj, '"obj" after enhancements contain "baz" only' );
  console.log( obj.rrr, 'but "obj.rrr" still exist' );
  console.log( o, '"o" after timeout ended' );
  console.log( '---- THE END ----' );
}

console.log( o, '"o" after timeout called' );

如何?

您可以在保留结构的同时摆脱那些引用吗?

是否可以从一开始就获得在新对象中设置的值(例如克隆它)?

1 个答案:

答案 0 :(得分:0)

Object.create()方法使用x作为新创建的对象的原型来创建新对象。因此,属性rrrobj中直接不存在。它存在于[[Prototype]](或__proto__)中

var x = { prop: 1 }
var y = Object.create(x)

console.log(y.prop) // 1
console.log("prop" in y) // true
console.log(y.__proto__ === x) // true
console.log(y.hasOwnProperty("prop")) // false

如果指定的属性在指定的对象或其原​​型链中,则in运算符将返回true。因此,在这种情况下,它返回true。

但是,另一方面,hasOwnProperty()方法返回一个布尔值,该布尔值指示对象是否具有自己的属性。这就是即使y.hasOwnProperty("prop")返回1的情况下y.prop返回false的原因。

如果要直接在y中获取属性,则可以改用Object.assign()。这样会将所有可枚举的属性从x复制到一个空的目标对象。

var x = { prop: 1 }
var y = Object.assign({}, x)

console.log(y.prop) // 1
console.log(y.hasOwnProperty("prop")) // true