Node.js querystring.parse()方法返回看起来像是一个对象的东西,但是没有构造函数的东西。根据{{3}}:
“... querystring.parse()方法返回的对象不是原型继承自JavaScript对象。这意味着典型的Object方法,如obj.toString(),obj.hasOwnProperty()等等。没有定义,也不会起作用。“
这很容易导致错误,因为通常你会假设每个Object都理解一些基本方法,比如toString(),并且它有一个“构造函数”,或多或少地告诉我们它的“类型”。
处理这些相当无能为力的对象的最佳方法是什么?我试过了:
let myOb = new Object(dumbObject);
但是这会产生一个没有toString() - 方法的结果,并且没有属性'constructor'。
将这些愚蠢的物体变成通常表现的物体的最佳方法是什么?并且,为什么有人想要首先创建这样的对象?
答案 0 :(得分:1)
我认为(从我的头脑中)
让newObject = JSON.parse(JSON.stringify(dumbObject))
应该有用。
答案 1 :(得分:1)
如果您想要更通用的方式在对象上调用toString()
,可以使用Object.prototype
从.call()
调用它。
var s = Object.prototype.toString.call(smartObject);
但为什么呢?它只会在任何普通对象上给你"[object Object]"
。为什么获得该字符串很重要?
var p = {};
var s = Object.create(null);
console.log(p.toString());
console.log(Object.prototype.toString.call(s));

答案 2 :(得分:1)
不,你不会。如果您做出这样的假设,请在界面中记录它们。通常你会假设
将这些愚蠢的物体变成通常表现的物体的最佳方法是什么?
将Object.assign
与普通对象一起用作目标。或者,您也可以使用Object.setPrototypeOf
更改原型,但那是not recommended。
或者只是创建您需要的.toString
或.constructor
等属性。请参阅this example。
而且,为什么有人想要首先创建这样的对象?
因为在使用对象而不是Map
时需要这种安全性。请参阅this example。
答案 3 :(得分:0)
var dumbObject = Object.create(null);
Object.setPrototypeOf(dumbObject, Object.prototype);
dumbObject.toString() //runs fine
答案 4 :(得分:0)
感谢所有答案,其中一个答案包含另一个问题的链接,这个问题也是我的问题,即使我一开始并不知道。另一个问题是:How to create a JS object with the default prototype from an object without a prototype?
从中我发现答案我认为是目前为止最简单的解决方案:使用Object.assign()。像这样:
let orphan = require('querystring').parse("{}") ;
// console.log ( "Got value: " + orphan ) ;
// Above causes the error:
// -> TypeError: Cannot convert object to primitive value
let oa = (x) => Object.assign({}, x);
console.log ("Got value: " + oa (orphan) ) ;
注意问题不是特别关于“查询字符串”,而是一般没有原型的对象。是的,我们应该把这些可怜的对象称为“孤儿”而不是“愚蠢”。但我认为“愚蠢”仍然是一个很好的术语。没有原型的对象很少(或没有?)方法,所以如果有任何我们想问的问题它可以回答很少。