Объект сохраняет трек ссылки, но не сохраняет его в объекте - PullRequest
1 голос
/ 19 июня 2019

При передаче объекта в функцию в качестве параметра и использовании его для создания отдельного объекта с помощью 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 голосов
/ 19 июня 2019

Метод Object.create() создает новый объект, используя x в качестве прототипа вновь созданного объекта.Таким образом, свойство rrr напрямую не существует в obj.Он существует в [[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") возвращает false, даже если y.prop возвращает 1.

Если вы хотите получить свойства непосредственно в y, вы можете использовать Object.assign().Это копирует все перечисляемые собственные свойства из x в пустой целевой объект.

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

console.log(y.prop) // 1
console.log(y.hasOwnProperty("prop")) // true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...