метод Object.create () выполняет поверхностное копирование?

1

Я новичок в JavaScript. Когда я читаю документацию Object.create, она написана так: "Метод Object.create() создает новый объект, используя существующий объект" (Ref: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create). Он ничего не упоминает о мелкой копии объекта. Но когда я экспериментировал с нижеприведенным сценарием, я подтвердил, что метод create выполняет мелкую копию.

var foo = {
  a : 100,
  details : {
    version : 1.1,
    name : 'Demo of object inheritance'
  },

  printInfo : function(){
    console.log(this.details.version);
    console.log(this.details.name);
    console.log(this.a);
  }

}

var bar = Object.create(foo);

foo.printInfo();
bar.printInfo();

console.log("\n Updating the details and property a of bar object");

bar.details.version = 2.2;
bar.details.name = "Bar object changed the name";
bar.a = 123456;

console.log("\n")
foo.printInfo();
bar.printInfo();

Правильно ли я понимаю? Пожалуйста, укажите мне любую документацию, подтверждающую, что метод create() выполняет мелкую копию.

Когда я выполнил в Scratchpad, я увидел ниже вывод в консоли.

1.1
Demo of object inheritance
100
1.1
Demo of object inheritance
100

Updating the details and property a of bar object Scratchpad/1:21:1


2.2
Bar object changed the name
100
2.2
Bar object changed the name
123456
  • 3
    Он вообще не копирует переданный объект, вместо этого он устанавливает внутренний прототип вновь созданного объекта переданному объекту.
  • 0
    Нет, это просто создать тот же объект. если вы хотите клонировать его, вы можете использовать новый es6 {... object}
Показать ещё 3 комментария
Теги:

3 ответа

1
Лучший ответ

Это не имеет ничего общего с мелкой копией. Вместо этого вы выяснили, как работает Prototype Inheritance в мире Javascript.

Чтобы лучше понять, позвольте разбить это на следующие 2 части:

Чтение свойства из дочернего объекта:

Когда вы пытаетесь получить доступ к ресурсу из дочернего объекта, парсер Javascript попытается найти цепочку прототипов до тех пор, пока ей не удастся ее найти, иначе возвратите undefined, если не найдете.

Свойство Write в дочернем объекте

Сначала попытается найти объект, к которому принадлежит ваше целевое свойство, а затем прямо установить это свойство на этом объекте.

Возьмем, пожалуйста, часть вашего кода:


bar.details.version = 2.2;

 What Javascript parser does:
  1. Во-первых, детали будут расположены через поиск прототипа цепи, и он будет найден на foo (то есть: bar.details === foo.details)

  2. Во-вторых, версия напрямую задается на объекте деталей (что почему this.details.version и this.details.name оба "неожиданно" изменены, как вы видели в своем результате, и в результате bar.details.version === foo.details.version === 2.2))


bar.a = 123456;

What Javascript parser does:

Прежде чем что - либо запускается, бар уже находится и там нет необходимости искать хотя цепи прототипов, в результате, будет непосредственно устанавливается на панели (то есть. И поэтому только bar.a пострадавших с foo.a все еще держа происхождение значение: 123456)

0

метод создания выполняет мелкую копию.

- EDIT -

Нет, это может показаться таким, но термин мелкой копии будет неточным. Это было бы больше в соответствии с прототипной статьей MDN наследования

Если объект oA имеет свойство name, функция Object.create(oA) создает новый объект oB. Попытка доступа к свойству oB.name будет искать цепочку прототипов, пока не найдет ее на своем прототипе в oA.name.

Пример кода ниже:

/* create one object adam */
const adam = {
	name: 'Adam',
} 
console.log('does adam have own 'name' property?', adam.hasOwnProperty('name')) // true

/* create new object bob, whose prototype 'ancestor' is adam */
const bob = Object.create(adam)
console.log('does bob have own 'name' property? (1)', bob.hasOwnProperty('name')) // false; the 'name' prop is on adam

/* assigning 'name' on bob doesn't change adam name, it just 'shadows' it -- accessing 'name' on bob returns the one on bob */
bob.name = 'Bob'
console.log('does bob have own 'name' property? (2)', bob.hasOwnProperty('name')) // now true

/* adam and bob now each have their own 'name' property */
console.log(adam.name) // Adam
console.log(bob.name)  // Bob

/* show the relationship of adam and bob */
console.log('is adam a prototype 'ancestor' of bob?', adam.isPrototypeOf(bob)) // true, linked via Object.create()
console.log('is bob a prototype 'ancestor' of adam?', bob.isPrototypeOf(adam)) // false, the prototype points one way

Надеюсь это поможет. Ура,

  • 0
    Это не «клон», а ваше «правило большого пальца», безусловно, не имеет никакого смысла.
  • 0
    @JonasWilms Должен не согласиться, слово «клон» в данном случае является достаточной метафорой. Согласно MDN Object.create () : «Метод Object.create () создает новый объект ...».
Показать ещё 2 комментария
0

Object.Create вообще ничего не копирует, он просто устанавливает переданный объект в качестве прототипа нового объекта:

const person = {name: 'Alex', age: 29}
const newPerson = Object.create(person)

console.log(newPerson)

Изображение 174551

Чтобы сделать мелкую копию, вы можете использовать Object.assign.

const newPersonObj = Object.assign({}, person)
console.log(newPersonObj)

Это создаст совершенно новую копию. Изображение 174551

  • 0
    Привет Sandip, ты пробовал с вложенным объектом. Я заметил, это выполняет мелкую копию ....
  • 1
    @HariKrishna: Как уже было сказано несколько раз, и как было показано в этом ответе, Object.create вообще не создает копию.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню