Получение только непрототипных свойств объекта - PullRequest
0 голосов
/ 12 апреля 2019

Есть ли способ создать копию объекта JS, который содержит только свойства объекта, не относящиеся к прототипу?

Примерно так:

 var copy = object.onlyOwnProperties();

1 Ответ

3 голосов
/ 12 апреля 2019

Объекты, как вы, вероятно, знаете, связаны с прототипом - поэтому у них на самом деле нет свойств прототипа. Они связаны с другим объектом, обладающим свойствами, и система ищет цепочку, когда не может найти свойство. Таким образом, вы не можете удалить то, чего нет у объекта.

Вы можете однако разорвать цепочку и создать объект, который ни с чем не связан с 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())
...