如何在Javascript中减少JSON解析对象原型?

时间:2017-07-05 09:24:59

标签: javascript json node.js

我有一个原型较少的Javascript对象。

var foo = Object.create(null);

然后我读了一个JSON文件(在NodeJS中)并使用JSON.parse将它分配给foo。像这样 -

fs.readFile('talks.json', 'utf8', function(err, text){
  if(err) throw error;
  foo = JSON.parse(text);
});

但是当我检查foo的原型时,它不再是“null”,因为它原本打算成为。

有没有办法删除原型foo并再次使其无原型?

3 个答案:

答案 0 :(得分:2)

JSON.parse()方法接受可用于将对象转换为无原型对象的回调。

JSON.parse(string, function(k, v) {
   if (v && typeof v === 'object' && !Array.isArray(v)) {
     return Object.assign(Object.create(null), v);
   }
   return v;
});

https://esdiscuss.org/topic/proposal-add-an-option-to-omit-prototype-of-objects-created-by-json-parse

答案 1 :(得分:0)

我不是100%肯定,但我认为这里的问题是javascript vm必须分配原型。如果您使用.prototype检查原型,则值为undefined。如果您使用.__proto__进行核对,则表明它是一个空白对象。

这是有道理的,因为原型即使没有定义也不应该是什么。程序员不应该使用.__proto__。如果您必须检查原型,请使用.prototype



var foo = Object.create(null);
console.log(foo); //{}
console.log(foo.__proto__); //undefined
console.log(foo.prototype); //undefined

var foo = JSON.parse("{\"a\":\"bla\"}");
console.log(foo); //like in the JSON string
console.log(foo.__proto__); //{}
console.log(foo.prototype); //undefined




答案 2 :(得分:0)

我遇到了同样的问题,我找到的解决方案是使用Object.assing()

var prototypeLessTalks = Object.create(null);
var talksParsed = JSON.parse(readFileContent('./talks.json', 'utf8'));

Object.assign(prototypeLessTalks, talksParsed); // here

function readFileContent(fileName, encoding) {
  return fs.readFileSync(fileName, encoding, (err, data) => {
    if (err) throw err;
    return data.toString();
  });
}

Object.assing()不会覆盖已存在的目标对象的属性。