文档说这个对象不是从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
的原型实际上是一个对象,它只有一个属性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不是一个函数,而是一个字符串。 因此,它不会从对象继承。