Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何处理没有构造函数的JavaScript对象_Javascript_Node.js - Fatal编程技术网

如何处理没有构造函数的JavaScript对象

如何处理没有构造函数的JavaScript对象,javascript,node.js,Javascript,Node.js,方法的作用是:返回看起来像是一个对象,但没有构造函数的对象。根据: “…querystring.parse()方法返回的对象不是从JavaScript对象的原型继承。这意味着典型的对象方法,如obj.toString()、obj.hasOwnProperty()和其他方法未定义且无法工作。” 这很容易导致错误,因为通常您会假设每个对象都理解一些基本方法,比如toString(),并且它有一个“构造函数”,或多或少地告诉我们它的“类型” 处理这些毫无能力的物体最好的方法是什么?我试过: let m

方法的作用是:返回看起来像是一个对象,但没有构造函数的对象。根据:

“…querystring.parse()方法返回的对象不是从JavaScript对象的原型继承。这意味着典型的对象方法,如obj.toString()、obj.hasOwnProperty()和其他方法未定义且无法工作。”

这很容易导致错误,因为通常您会假设每个对象都理解一些基本方法,比如toString(),并且它有一个“构造函数”,或多或少地告诉我们它的“类型”

处理这些毫无能力的物体最好的方法是什么?我试过:

let myOb =  new Object(dumbObject);
但这会产生一个结果,该结果也没有toString()方法,也没有属性“constructor”

将这些愚蠢的对象转化为行为正常的对象的最佳方式是什么?而且,为什么有人要首先创建这样的对象呢?

我想(从我的头顶上看)

让newObject=JSON.parse(JSON.stringify(dumbObject))


应该可以工作。

如果您想要一种更通用的方法来调用对象上的
toString()
,您可以使用
.call()
对象.prototype
调用它


但是为什么呢?它只会在任何普通对象上为您提供
“[对象]”
。为什么得到那根绳子很重要

var p={};
var s=Object.create(null);
log(p.toString());

log(Object.prototype.toString.call)使用

通常你会认为

不,你不会的。如果您做出这样的假设,请在界面中记录它们

将这些愚蠢的对象转化为行为正常的对象的最佳方式是什么

使用
对象。将普通对象指定为目标。或者,您也可以通过使用更改原型,但这是唯一的

或者只需创建所需的属性,如
.toString
.constructor
。看

还有,为什么有人要首先创建这样的对象


因为在使用对象而不是
Map
s时需要这种安全性。请参阅。

感谢您提供的所有答案,其中一个包含指向另一个问题的链接,该问题实际上也是我的问题,即使我一开始并不知道。另一个问题是:

从中我找到了答案,我认为这是迄今为止最简单的解决方案:使用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) ) ;

请注意,问题并不特别是关于“querystring”,而是关于一般没有原型的对象。是的,我们应该称这些可怜的物体为“孤儿”,而不是“哑巴”。但我认为“哑巴”仍然是一个很好的术语。一个没有原型的对象几乎没有(或者没有?)方法,所以如果我们想问它什么问题,它只能回答很少的问题

我是说。。。你需要什么特别的东西?您仍然可以获取一个键数组,或者将其转换为json。您所说的是一个查询字符串解析器,它创建的dto类型对象比真正的对象多。至于
toString()
,只要使用json序列化即可。还要记住,javascript是非常松散的类型,所以知道“类型”并不意味着它在C#这样的强类型语言中会是什么。为什么要使用“哑对象”这样的语言?你不明白为什么需要这个吗?如果您的查询字符串与
Object.prototype
上的原型属性共享参数名,该怎么办?我想在控制台上登录任何方法、函数或表达式的结果。所以我想写:让s2=require('querystring').parse(“”);console.log(“获取值:+s2”);但这会产生错误“无法将对象转换为基本值”@PanuLogic:是否需要将
console.log()
作为字符串值?似乎记录实际值会更有用,因为控制台通常允许您扩展对象以观察它们。谢谢。我试试看。我希望这适用于所有可能的值类型,除了可能为null和未定义?或许他们也是。正如我在其中一条评论中所解释的,我正在尝试记录值,当然,我想用同样简单的代码记录每种可能的值类型。@PanuLogic:它只适用于基本体,不包括
未定义的
,以及包含这些基本体、对象或数组的对象和数组。没有函数或正则表达式,它将只访问自己的(不是继承的)属性和可枚举属性。这是用于不同编程环境之间简单、特定的数据序列化和共享,而不是一般的数据记录或调试。如果您对如何使用生成的对象不十分小心,这种类型的转换可能会导致错误
querystring.parse()
可能是因为一个非常特殊的原因才这样做的。它希望您能够枚举它拥有的属性,并使所有这些属性都成为查询字符串中的实际项,而不会将内置对象方法与查询字符串中的实际内容混淆。更现代的方法是使用
Map
对象,该对象以更好的方式处理此问题。为什么获取该字符串很重要?因为(一个例子)我想在控制台或文件上记录数据。然后像let s2=require('querystring').parse(“”);console.log(“获取值:+s2”);崩溃如果我看到[object object]就可以了,但是如果它崩溃了就不那么好了。如果我需要,现在看来我确实需要,假设当我试图将记录的东西转换为字符串时,它们可能会崩溃,这意味着我的记录代码需要变得比我希望的更复杂。@PanuLogic:不想抛出错误是有道理的,但这是另一个问题的答案。是的,JS松了。在运行时,所有类型检查都由您承担。你不必担心abo
var dumbObject = Object.create(null);
Object.setPrototypeOf(dumbObject, Object.prototype);
dumbObject.toString() //runs fine
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) ) ;