Объекты, как вы, вероятно, знаете, связаны с прототипом - поэтому у них на самом деле нет свойств прототипа. Они связаны с другим объектом, обладающим свойствами, и система ищет цепочку, когда не может найти свойство. Таким образом, вы не можете удалить то, чего нет у объекта.
Вы можете однако разорвать цепочку и создать объект, который ни с чем не связан с Object.create(null)
. Например:
let o = {
name: "Mark",
trade: "Pirate"
}
// o is linked to the Object prototype and
// gets these props from the Object
console.log(Object.getOwnPropertyNames(o.__proto__))
// which means it has things like toString()
console.log(o.toString())
// bare is a stand alone with no prototype
// it will ONLY have the two props
let bare = Object.assign(Object.create(null), o)
console.log(bare.__proto__)
// no toString or anything else
console.log(bare.toString)
// just original props
console.log(bare.name)
Может быть, это слишком экстремально, и вам действительно нужны методы объекта, но больше ничего. В этом случае вы можете Object.assign
с литералом объекта:
let o = {
name: "Mark",
trade: "Pirate"
}
let child = {
childProp: "someVal"
}
Object.setPrototypeOf(child, o)
// child gets o props through prototype
console.log("from prototype:", child.name)
// make an object with only child props
// that is still linked to the Object prototype
let bareChild = Object.assign({}, child)
// no props from o
console.log("from prototype:", bareChild.name)
// just it's own
console.log("own prop:", bareChild.childProp)
// but this still works:
console.log("toString", bareChild.toString())