为什么Node.js querystring.parse()返回一个不继承自JavaScript`Object`的对象?

时间:2018-09-17 10:58:10

标签: javascript node.js query-string

文档说该对象没有从JavaScript Object继承,但是没有显示不从JavaScript继承的原因。那么,为什么Node.js querystring.parse()返回的对象不是从JavaScript Object继承的?

1 个答案:

答案 0 :(得分:0)

医生说:

  

querystring.parse()方法返回的对象原型并不从JavaScript对象继承

该语句并不意味着它没有原型。但是,是的,在这种情况下,并不是因为protoype的值为空(如下面的代码片段所示)。

要弄清为什么该语句并不暗示它没有原型,请考虑obj的值:

var obj = Object.create(
  Object.create(null, { test: { value: "test string" } })
);
console.log(Object.getPrototypeOf(obj) === Object.prototype); // false
console.log(Object.getPrototypeOf(obj) === undefined); // false
console.log(Object.getPrototypeOf(obj) === null); // false

它不是原型上从JavaScript Object继承的,但这并不意味着它没有原型。 obj的原型实际上是一个对象,它只有一个值为test的属性test string

此外,当在编辑之前询问问题时,它暗示querystring没有原型,但事实并非如此。 (根据此输入再次编辑了问题)。

执行以下代码,您会更好地理解。

const querystring = require('querystring')

const parsed = querystring.parse('foo=bar&abc=xyz&abc=123')

console.log(Object.getPrototypeOf(querystring)  === Object.prototype) // true
console.log(Object.getPrototypeOf(parsed) === Object.prototype) // false
console.log(Object.getPrototypeOf(parsed)) // null

现在,要回答为什么变量parsed不继承自Object的原因是正确性和安全性(基于评论的输入):

所以,如果您有类似的东西:

const parsed = querystring.parse('__proto__=bar&toString=oops')

它将创建一个键为'toString'和' proto '的对象,并且如果这些方法确实存在(假定它从Object继承),则在代码中使用时会抛出错误,因为现在toString不是函数,而是字符串。 因此,它不继承自Object。