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

时间:2017-08-21 21:00:47

标签: javascript node.js

Node.js querystring.parse()方法返回看起来像是一个对象的东西,但是没有构造函数的东西。根据{{​​3}}:

“... querystring.parse()方法返回的对象不是原型继承自JavaScript对象。这意味着典型的Object方法,如obj.toString(),obj.hasOwnProperty()等等。没有定义,也不会起作用。“

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

处理这些相当无能为力的对象的最佳方法是什么?我试过了:

let myOb =  new Object(dumbObject);

但是这会产生一个没有toString() - 方法的结果,并且没有属性'constructor'。

将这些愚蠢的物体变成通常表现的物体的最佳方法是什么?并且,为什么有人想要首先创建这样的对象?

5 个答案:

答案 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)

使用Object#setPrototypeOf

显式设置哑对象的原型
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) ) ;

注意问题不是特别关于“查询字符串”,而是一般没有原型的对象。是的,我们应该把这些可怜的对象称为“孤儿”而不是“愚蠢”。但我认为“愚蠢”仍然是一个很好的术语。没有原型的对象很少(或没有?)方法,所以如果有任何我们想问的问题它可以回答很少。