Я новичок в 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
Это не имеет ничего общего с мелкой копией. Вместо этого вы выяснили, как работает Prototype Inheritance в мире Javascript.
Чтобы лучше понять, позвольте разбить это на следующие 2 части:
Чтение свойства из дочернего объекта:
Когда вы пытаетесь получить доступ к ресурсу из дочернего объекта, парсер Javascript попытается найти цепочку прототипов до тех пор, пока ей не удастся ее найти, иначе возвратите undefined, если не найдете.
Свойство Write в дочернем объекте
Сначала попытается найти объект, к которому принадлежит ваше целевое свойство, а затем прямо установить это свойство на этом объекте.
bar.details.version = 2.2;
What Javascript parser does:
Во-первых, детали будут расположены через поиск прототипа цепи, и он будет найден на foo (то есть: bar.details === foo.details)
Во-вторых, версия напрямую задается на объекте деталей (что почему 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)
метод создания выполняет мелкую копию.
- 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
Надеюсь это поможет. Ура,
Object.Create
вообще ничего не копирует, он просто устанавливает переданный объект в качестве прототипа нового объекта:
const person = {name: 'Alex', age: 29}
const newPerson = Object.create(person)
console.log(newPerson)
Чтобы сделать мелкую копию, вы можете использовать Object.assign
.
const newPersonObj = Object.assign({}, person)
console.log(newPersonObj)
Это создаст совершенно новую копию.
Object.create
вообще не создает копию.