文档说该对象没有从JavaScript Object
继承,但是没有显示不从JavaScript继承的原因。那么,为什么Node.js querystring.parse()
返回的对象不是从JavaScript Object
继承的?
答案 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。