如何从 Javascript 中的对象中删除所有 getter 和 setter 并保持纯值

How to remove all getters and setters from an object in Javascript and keep pure value

我正在使用一个名为 JS 对象作为输入的库。不幸的是,我正在使用的 JSONP api returns 一个包含 getter 和 setter 的对象,这个特定的库不知道如何处理。

如何在保留属性值的同时从对象中删除所有 getter 和 setter,从而得到一个普通的 JavaScript 对象?

getOwnPropertyDescriptors得到当前所有的描述符,找到get属性的,重新定义。但是,如果 属性 是可配置的,您将只能执行此操作。

const descriptors = Object.getOwnPropertyDescriptors(obj);

Object.keys(descriptors)
  .filter(key => descriptors[key].get)
  .forEach(key => Object.defineProperty(obj, key, {value: obj[key]}));

Object.getOwnPropertyDescriptors 是一个 ES7 提案。同时,这是 here:

的一个实现
function getOwnPropertyDescriptors(obj) {
  const result = {};
  for (let key of Reflect.ownKeys(obj)) {
      result[key] = Object.getOwnPropertyDescriptor(obj, key);
  }
  return result;
}

这个特殊 case/environment/setting 的解决方案可能看起来像这样...

var
  obj = JSON.parse(JSON.stringify(model));

console.log("obj before : ", obj);

Object.keys(obj).reduce(function (obj, key) {

  if (obj["_" +  key] === obj[key]) {
    delete obj["_" +  key];
  }
  return obj;

}, obj);

console.log("obj after : ", obj);

另请参阅... http://jsfiddle.net/w23uLttu/8/

在尝试了各种操作(例如序列化到 JSON 并返回)之后,我最终编写了一个简单的 shallowClone 函数来处理这个问题:

const shallowClone = (obj) => {
  return Object.keys(obj).reduce((clone, key) => {
    clone[key] = obj[key];
    return clone;
  }, {});
}