JavaScript оператор удаления и метод Object.create () - PullRequest
0 голосов
/ 07 марта 2020

Я пытаюсь удалить свойство из Person объекта следующим образом:

const Person = {
  firstname: 'John',
  lastname: 'Doe'
}

console.log(Person.firstname);
// Output: "John"

delete Person.firstname;

console.log(Person.firstname);
// Output: undefined

Когда я использую этот оператор delete работает нормально, а Person.firstname журнал показывает как undefined, как и ожидалось. Но когда я создаю новый объект, используя этот Person объект, используя Object.create() метод, подобный этому:

const Person = {
  firstname: 'John',
  lastname: 'Doe'
}

const Person2 = Object.create(Person);

console.log(Person2.firstname);
// Output: "John"

delete Person2.firstname;

console.log(Person2.firstname);
// expected output: undefined
// actual output: "John"

Вы можете видеть, что Person2.firstname возвращает «Джона» в конце, когда я ожидал, что он будет работать так же, как в первом фрагменте, и вернет undefined .

Итак, мои вопросы здесь:

  • Почему delete Person2.firstname не работает?
  • Кроме того, как мы можем удалить свойство firstname из Person2 объект?

Спасибо за помощь.

Ответы [ 2 ]

2 голосов
/ 07 марта 2020

delete будет только успешно удалить свойство из объекта, если удаляемое свойство является собственным ненастраиваемым свойством. Здесь ваш Person2 действительно не имеет собственное свойство firstname, поэтому delete Person2.firstname не работает. Свойство существует во внутреннем прототипе Person2, но не на самом Person2.

Чтобы удалить свойство, вам нужно вызвать delete с объектом-прототипом:

delete Person.firstname;

const Person = {
  firstname: 'John',
  lastname: 'Doe'
}
const Person2 = Object.create(Person);
delete Person.firstname;
console.log(Person2);

или, если у вас еще нет ссылки на него, используйте Object.getPrototypeOf:

delete Object.getPrototypeOf(Person2).firstname;

const Person = {
  firstname: 'John',
  lastname: 'Doe'
}

const Person2 = Object.create(Person);
delete Object.getPrototypeOf(Person2).firstname;
console.log(Person2);
0 голосов
/ 07 марта 2020

вы создаете поверхностную копию и хотите сделать глубокую копию

, что может быть достигнуто чем-то вроде

const Person = {
  firstname: 'John',
  lastname: 'Doe'
}



const Person2 = Object.assign({},Person);

console.log(Person2.firstname);
// Output: "John"

delete Person2.firstname;

console.log(Person2.firstname);
// expected output: undefined
// actual output: "undefined"
console.log(Person2.lastname)

это даст вам больше ясности в мелкой и глубокой копии

...