我有一个原型较少的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并再次使其无原型?
答案 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;
});
答案 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()不会覆盖已存在的目标对象的属性。