为什么 Node.js querystring.parse() 返回一个不继承自 JavaScript 'Object'



文档说这个对象不是从JavaScriptObject继承的,但是它没有显示它不继承它的原因。那么,为什么 Node.jsquerystring.parse()返回一个不是从 JavaScriptObject继承的对象?

文档说:

querystring.parse(( 方法返回的对象不是原型继承自 JavaScript 对象

该声明并不意味着它没有原型。但是,是的,在这种情况下,它没有,因为protoype的值为 null(在下面的代码片段中显示(。

为了澄清为什么该语句并不意味着它没有原型,请考虑 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

它不是原型继承自JavaScriptObject,但这并不意味着它没有原型。obj的原型实际上是一个对象,它只有一个属性testtest 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不是一个函数,而是一个字符串。 因此,它不会从对象继承。

相关内容

最新更新