0

我正在尝试从这样的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最终返回“John”,而我希望它的工作方式与第一个片段中的相同,并返回undefined

所以,我的问题是:

  • 为什么delete Person2.firstname不工作?
  • 另外,我们如何firstnamePerson2对象中删除属性?

谢谢你的帮助。

4

2 回答 2

2

delete仅当要删除的属性是自己的不可配置属性时,才会成功地从对象中删除属性。在这里,你Person2没有自己的属性,所以不起作用。该属性存在于 的内部原型上,但不存在于自身上。firstnamedelete Person2.firstnamePerson2Person2

要删除该属性,您必须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);

于 2020-03-07T07:09:09.487 回答
0

你正在创建一个浅拷贝并且你想做深拷贝

这可以通过类似的东西来实现

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)

这将使您更清楚地了解浅拷贝和深拷贝

于 2020-03-07T07:29:24.090 回答